all/ethtool: merge branch 'th/ethtool-options-rh1335409-1'

Add support for setting offload features (akin to ethtool's
-K|--offload|--feature).

https://bugzilla.redhat.com/show_bug.cgi?id=1335409
https://github.com/NetworkManager/NetworkManager/pull/179
This commit is contained in:
Thomas Haller 2018-08-10 10:39:00 +02:00
commit da3b72d842
96 changed files with 5068 additions and 1970 deletions

View file

@ -453,6 +453,7 @@ libnm_core_lib_h_pub_real = \
libnm-core/nm-setting-connection.h \
libnm-core/nm-setting-dcb.h \
libnm-core/nm-setting-dummy.h \
libnm-core/nm-setting-ethtool.h \
libnm-core/nm-setting-generic.h \
libnm-core/nm-setting-gsm.h \
libnm-core/nm-setting-infiniband.h \
@ -502,6 +503,7 @@ libnm_core_lib_h_priv = \
shared/nm-utils/nm-shared-utils.h \
shared/nm-utils/nm-random-utils.h \
shared/nm-utils/nm-udev-utils.h \
shared/nm-ethtool-utils.h \
shared/nm-meta-setting.h \
libnm-core/crypto.h \
libnm-core/nm-connection-private.h \
@ -524,6 +526,7 @@ libnm_core_lib_c_settings_real = \
libnm-core/nm-setting-connection.c \
libnm-core/nm-setting-dcb.c \
libnm-core/nm-setting-dummy.c \
libnm-core/nm-setting-ethtool.c \
libnm-core/nm-setting-generic.c \
libnm-core/nm-setting-gsm.c \
libnm-core/nm-setting-infiniband.c \
@ -565,6 +568,7 @@ libnm_core_lib_c_real = \
shared/nm-utils/nm-shared-utils.c \
shared/nm-utils/nm-random-utils.c \
shared/nm-utils/nm-udev-utils.c \
shared/nm-ethtool-utils.c \
shared/nm-meta-setting.c \
libnm-core/crypto.c \
libnm-core/nm-connection.c \
@ -2390,6 +2394,7 @@ EXTRA_DIST += \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-3.expected \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4 \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-write-unknown-4.expected \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected \
src/settings/plugins/ifcfg-rh/tests/network-scripts/keys-test-wifi-dynamic-wep-leap \
src/settings/plugins/ifcfg-rh/tests/network-scripts/keys-test-wifi-leap \
src/settings/plugins/ifcfg-rh/tests/network-scripts/keys-test-wifi-wep \
@ -3425,6 +3430,9 @@ clients_common_libnmc_la_SOURCES = \
shared/nm-meta-setting.c \
shared/nm-meta-setting.h \
\
shared/nm-ethtool-utils.c \
shared/nm-ethtool-utils.h \
\
clients/common/nm-meta-setting-desc.c \
clients/common/nm-meta-setting-desc.h \
clients/common/nm-meta-setting-access.c \

View file

@ -770,7 +770,8 @@ const NmcMetaGenericInfo *const metagen_con_active_vpn[_NMC_GENERIC_INFO_TYPE_CO
NM_SETTING_6LOWPAN_SETTING_NAME","\
NM_SETTING_PROXY_SETTING_NAME"," \
NM_SETTING_TC_CONFIG_SETTING_NAME"," \
NM_SETTING_SRIOV_SETTING_NAME
NM_SETTING_SRIOV_SETTING_NAME"," \
NM_SETTING_ETHTOOL_SETTING_NAME
// NM_SETTING_DUMMY_SETTING_NAME
// NM_SETTING_WIMAX_SETTING_NAME

View file

@ -662,25 +662,19 @@ nmc_setting_remove_property_option (NMSetting *setting,
char **
nmc_setting_get_valid_properties (NMSetting *setting)
{
char **valid_props = NULL;
GParamSpec **props, **iter;
guint num;
int i;
const NMMetaSettingInfoEditor *setting_info;
char **valid_props;
guint i, num;
/* Iterate through properties */
i = 0;
props = g_object_class_list_properties (G_OBJECT_GET_CLASS (G_OBJECT (setting)), &num);
valid_props = g_malloc0 (sizeof (char*) * (num + 1));
for (iter = props; iter && *iter; iter++) {
const char *key_name = g_param_spec_get_name (*iter);
setting_info = nm_meta_setting_info_editor_find_by_setting (setting);
/* Add all properties except for "name" that is non-editable */
if (g_strcmp0 (key_name, "name") != 0)
valid_props[i++] = g_strdup (key_name);
}
valid_props[i] = NULL;
g_free (props);
num = setting_info ? setting_info->properties_num : 0;
valid_props = g_new (char *, num + 1);
for (i = 0; i < num; i++)
valid_props[i] = g_strdup (setting_info->properties[i]->property_name);
valid_props[num] = NULL;
return valid_props;
}

View file

@ -1092,7 +1092,18 @@ _print_fill (const NmcConfig *nmc_config,
nm_assert (!to_free || value == to_free);
if (!nmc_config->overview || !is_default)
if ( is_default
&& ( nmc_config->overview
|| NM_FLAGS_HAS (text_out_flags, NM_META_ACCESSOR_GET_OUT_FLAGS_HIDE))) {
/* don't mark the entry for display. This is to shorten the output in case
* the property is the default value. But we only do that, if the user
* opts in to this behavior (-overview), or of the property marks itself
* elegible to be hidden.
*
* In general, only new API shall mark itself eligible to be hidden.
* Long established properties cannot, because it would be a change
* in behavior. */
} else
header_cell->to_print = TRUE;
if (NM_FLAGS_HAS (text_out_flags, NM_META_ACCESSOR_GET_OUT_FLAGS_STRV)) {

View file

@ -59,7 +59,7 @@ libnmc = static_library(
sources: files(
'nm-meta-setting-access.c',
'nm-meta-setting-desc.c'
) + shared_nm_utils_nm_meta_setting_c + [settings_docs_source],
) + shared_nm_meta_setting_c + shared_nm_ethtool_utils_c + [settings_docs_source],
dependencies: deps,
c_args: cflags,
link_with: libnmc_base,

View file

@ -132,7 +132,7 @@ nmc_string_to_bool (const char *str, gboolean *val_bool, GError **error)
}
gboolean
nmc_string_to_tristate (const char *str, NMCTriStateValue *val, GError **error)
nmc_string_to_ternary (const char *str, NMTernary *val, GError **error)
{
const char *s_true[] = { "true", "yes", "on", NULL };
const char *s_false[] = { "false", "no", "off", NULL };
@ -150,11 +150,11 @@ nmc_string_to_tristate (const char *str, NMCTriStateValue *val, GError **error)
}
if (nmc_string_is_valid (str, s_true, NULL))
*val = NMC_TRI_STATE_YES;
*val = NM_TERNARY_TRUE;
else if (nmc_string_is_valid (str, s_false, NULL))
*val = NMC_TRI_STATE_NO;
*val = NM_TERNARY_FALSE;
else if (nmc_string_is_valid (str, s_unknown, NULL))
*val = NMC_TRI_STATE_UNKNOWN;
*val = NM_TERNARY_DEFAULT;
else {
g_set_error (error, 1, 0,
_("'%s' is not valid; use [%s], [%s] or [%s]"),

View file

@ -24,12 +24,6 @@
#include "nm-active-connection.h"
#include "nm-device.h"
typedef enum {
NMC_TRI_STATE_NO,
NMC_TRI_STATE_YES,
NMC_TRI_STATE_UNKNOWN,
} NMCTriStateValue;
const NMObject **nmc_objects_sort_by_path (const NMObject *const*objs, gssize len);
const char *nmc_string_is_valid (const char *input, const char **allowed, GError **error);
@ -40,7 +34,7 @@ gboolean nmc_string_to_uint (const char *str,
unsigned long int max,
unsigned long int *value);
gboolean nmc_string_to_bool (const char *str, gboolean *val_bool, GError **error);
gboolean nmc_string_to_tristate (const char *str, NMCTriStateValue *val, GError **error);
gboolean nmc_string_to_ternary (const char *str, NMTernary *val, GError **error);
gboolean matches (const char *cmd, const char *pattern);

View file

@ -23,24 +23,32 @@
/*****************************************************************************/
static const NMMetaSettingInfoEditor *
_get_meta_setting_info_editor_from_msi (const NMMetaSettingInfo *meta_setting_info)
{
const NMMetaSettingInfoEditor *setting_info;
if (!meta_setting_info)
return NULL;
nm_assert (meta_setting_info->get_setting_gtype);
nm_assert (meta_setting_info->meta_type < G_N_ELEMENTS (nm_meta_setting_infos_editor));
setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type];
nm_assert (setting_info->general == meta_setting_info);
return setting_info;
}
const NMMetaSettingInfoEditor *
nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use_alias)
{
const NMMetaSettingInfo *meta_setting_info;
const NMMetaSettingInfoEditor *setting_info;
guint i;
g_return_val_if_fail (setting_name, NULL);
meta_setting_info = nm_meta_setting_infos_by_name (setting_name);
setting_info = NULL;
if (meta_setting_info) {
nm_assert (nm_streq0 (meta_setting_info->setting_name, setting_name));
if (meta_setting_info->meta_type < G_N_ELEMENTS (nm_meta_setting_infos_editor)) {
setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type];
nm_assert (setting_info->general == meta_setting_info);
}
}
setting_info = _get_meta_setting_info_editor_from_msi (nm_meta_setting_infos_by_name (setting_name));
if (!setting_info && use_alias) {
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
if (nm_streq0 (nm_meta_setting_infos_editor[i].alias, setting_name)) {
@ -56,25 +64,7 @@ nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use
const NMMetaSettingInfoEditor *
nm_meta_setting_info_editor_find_by_gtype (GType gtype)
{
const NMMetaSettingInfo *meta_setting_info;
const NMMetaSettingInfoEditor *setting_info;
meta_setting_info = nm_meta_setting_infos_by_gtype (gtype);
if (!meta_setting_info)
return NULL;
g_return_val_if_fail (meta_setting_info->get_setting_gtype, NULL);
g_return_val_if_fail (meta_setting_info->get_setting_gtype () == gtype, NULL);
if (meta_setting_info->meta_type >= G_N_ELEMENTS (nm_meta_setting_infos_editor))
return NULL;
setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type];
g_return_val_if_fail (setting_info->general == meta_setting_info, NULL);
return setting_info;
return _get_meta_setting_info_editor_from_msi (nm_meta_setting_infos_by_gtype (gtype));
}
const NMMetaSettingInfoEditor *
@ -86,12 +76,13 @@ nm_meta_setting_info_editor_find_by_setting (NMSetting *setting)
setting_info = nm_meta_setting_info_editor_find_by_gtype (G_OBJECT_TYPE (setting));
nm_assert (setting_info == nm_meta_setting_info_editor_find_by_name (nm_setting_get_name (setting), FALSE));
nm_assert (!setting_info || G_TYPE_CHECK_INSTANCE_TYPE (setting, setting_info->general->get_setting_gtype ()));
nm_assert (setting_info);
nm_assert (G_TYPE_CHECK_INSTANCE_TYPE (setting, setting_info->general->get_setting_gtype ()));
return setting_info;
}
/*****************************************************************************/
const NMMetaPropertyInfo *
nm_meta_setting_info_editor_get_property_info (const NMMetaSettingInfoEditor *setting_info, const char *property_name)
{

View file

@ -2719,19 +2719,19 @@ static gboolean
_set_fcn_connection_metered (ARGS_SET_FCN)
{
NMMetered metered;
NMCTriStateValue ts_val;
NMTernary ts_val;
if (!nmc_string_to_tristate (value, &ts_val, error))
if (!nmc_string_to_ternary (value, &ts_val, error))
return FALSE;
switch (ts_val) {
case NMC_TRI_STATE_YES:
case NM_TERNARY_TRUE:
metered = NM_METERED_YES;
break;
case NMC_TRI_STATE_NO:
case NM_TERNARY_FALSE:
metered = NM_METERED_NO;
break;
case NMC_TRI_STATE_UNKNOWN:
case NM_TERNARY_DEFAULT:
metered = NM_METERED_UNKNOWN;
break;
default:
@ -4823,6 +4823,85 @@ _validate_fcn_wireless_security_psk (const char *value, char **out_to_free, GErr
/*****************************************************************************/
static gconstpointer
_get_fcn_ethtool (ARGS_GET_FCN)
{
const char *s;
NMTernary val;
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 (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);
*out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_HIDE;
}
if (s && get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
s = gettext (s);
return s;
}
static gboolean
_set_fcn_ethtool (ARGS_SET_FCN)
{
gs_free char *value_clone = NULL;
NMTernary val;
NMEthtoolID ethtool_id = property_info->property_typ_data->subtype.ethtool.ethtool_id;
value = nm_strstrip_avoid_copy (value, &value_clone);
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_feature (NM_SETTING_ETHTOOL (setting),
nm_ethtool_data[ethtool_id]->optname,
val);
return TRUE;
}
static const char *const*
_complete_fcn_ethtool (ARGS_COMPLETE_FCN)
{
static const char *const v[] = {
"true",
"false",
"1",
"0",
"yes",
"no",
"default",
"on",
"off",
"ignore",
NULL,
};
if (!text || !text[0])
return &v[7];
return v;
}
/*****************************************************************************/
static const NMMetaPropertyInfo property_info_BOND_OPTIONS;
#define NESTED_PROPERTY_INFO_BOND(...) \
@ -4979,6 +5058,12 @@ static const NMMetaPropertyType _pt_gobject_devices = {
.complete_fcn = _complete_fcn_gobject_devices,
};
static const NMMetaPropertyType _pt_ethtool = {
.get_fcn = _get_fcn_ethtool,
.set_fcn = _set_fcn_ethtool,
.complete_fcn = _complete_fcn_ethtool,
};
/*****************************************************************************/
#include "settings-docs.h"
@ -5775,6 +5860,72 @@ static const NMMetaPropertyInfo *const property_infos_DCB[] = {
NULL
};
#define PROPERTY_INFO_ETHTOOL(xname) \
PROPERTY_INFO (NM_ETHTOOL_OPTNAME_##xname, NULL, \
.property_type = &_pt_ethtool, \
.property_typ_data = DEFINE_PROPERTY_TYP_DATA_SUBTYPE (ethtool, \
.ethtool_id = NM_ETHTOOL_ID_##xname, \
), \
)
#undef _CURRENT_NM_META_SETTING_TYPE
#define _CURRENT_NM_META_SETTING_TYPE NM_META_SETTING_TYPE_ETHTOOL
static const NMMetaPropertyInfo *const property_infos_ETHTOOL[] = {
PROPERTY_INFO_ETHTOOL (FEATURE_ESP_HW_OFFLOAD),
PROPERTY_INFO_ETHTOOL (FEATURE_ESP_TX_CSUM_HW_OFFLOAD),
PROPERTY_INFO_ETHTOOL (FEATURE_FCOE_MTU),
PROPERTY_INFO_ETHTOOL (FEATURE_GRO),
PROPERTY_INFO_ETHTOOL (FEATURE_GSO),
PROPERTY_INFO_ETHTOOL (FEATURE_HIGHDMA),
PROPERTY_INFO_ETHTOOL (FEATURE_HW_TC_OFFLOAD),
PROPERTY_INFO_ETHTOOL (FEATURE_L2_FWD_OFFLOAD),
PROPERTY_INFO_ETHTOOL (FEATURE_LOOPBACK),
PROPERTY_INFO_ETHTOOL (FEATURE_LRO),
PROPERTY_INFO_ETHTOOL (FEATURE_NTUPLE),
PROPERTY_INFO_ETHTOOL (FEATURE_RX),
PROPERTY_INFO_ETHTOOL (FEATURE_RXHASH),
PROPERTY_INFO_ETHTOOL (FEATURE_RXVLAN),
PROPERTY_INFO_ETHTOOL (FEATURE_RX_ALL),
PROPERTY_INFO_ETHTOOL (FEATURE_RX_FCS),
PROPERTY_INFO_ETHTOOL (FEATURE_RX_GRO_HW),
PROPERTY_INFO_ETHTOOL (FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD),
PROPERTY_INFO_ETHTOOL (FEATURE_RX_VLAN_FILTER),
PROPERTY_INFO_ETHTOOL (FEATURE_RX_VLAN_STAG_FILTER),
PROPERTY_INFO_ETHTOOL (FEATURE_RX_VLAN_STAG_HW_PARSE),
PROPERTY_INFO_ETHTOOL (FEATURE_SG),
PROPERTY_INFO_ETHTOOL (FEATURE_TLS_HW_RECORD),
PROPERTY_INFO_ETHTOOL (FEATURE_TLS_HW_TX_OFFLOAD),
PROPERTY_INFO_ETHTOOL (FEATURE_TSO),
PROPERTY_INFO_ETHTOOL (FEATURE_TX),
PROPERTY_INFO_ETHTOOL (FEATURE_TXVLAN),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_CHECKSUM_FCOE_CRC),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_CHECKSUM_IPV4),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_CHECKSUM_IPV6),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_CHECKSUM_IP_GENERIC),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_CHECKSUM_SCTP),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_ESP_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_FCOE_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_GRE_CSUM_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_GRE_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_GSO_PARTIAL),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_GSO_ROBUST),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_IPXIP4_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_IPXIP6_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_NOCACHE_COPY),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_SCATTER_GATHER),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_SCATTER_GATHER_FRAGLIST),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_SCTP_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_TCP6_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_TCP_ECN_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_TCP_MANGLEID_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_TCP_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_UDP_SEGMENTATION),
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),
NULL,
};
#undef _CURRENT_NM_META_SETTING_TYPE
#define _CURRENT_NM_META_SETTING_TYPE NM_META_SETTING_TYPE_GSM
static const NMMetaPropertyInfo *const property_infos_GSM[] = {
@ -7740,6 +7891,7 @@ _setting_init_fcn_wireless (ARGS_SETTING_INIT_FCN)
#define SETTING_PRETTY_NAME_CONNECTION N_("General settings")
#define SETTING_PRETTY_NAME_DCB N_("DCB settings")
#define SETTING_PRETTY_NAME_DUMMY N_("Dummy settings")
#define SETTING_PRETTY_NAME_ETHTOOL N_("Ethtool settings")
#define SETTING_PRETTY_NAME_GENERIC N_("Generic settings")
#define SETTING_PRETTY_NAME_GSM N_("GSM mobile broadband connection")
#define SETTING_PRETTY_NAME_INFINIBAND N_("InfiniBand connection")
@ -7827,6 +7979,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (BOND, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (BRIDGE,
@ -7834,6 +7987,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (BRIDGE, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (BRIDGE_PORT),
@ -7848,11 +8002,13 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
),
SETTING_INFO (CONNECTION),
SETTING_INFO (DCB),
SETTING_INFO (ETHTOOL),
SETTING_INFO_EMPTY (DUMMY,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (DUMMY, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO_EMPTY (GENERIC,
@ -7875,6 +8031,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (INFINIBAND, TRUE),
NM_META_SETTING_VALID_PART_ITEM (SRIOV, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
.setting_init_fcn = _setting_init_fcn_infiniband,
),
@ -7889,6 +8046,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (IP_TUNNEL, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (MACSEC,
@ -7897,6 +8055,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (MACSEC, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (802_1X, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (MACVLAN,
@ -7904,6 +8063,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (MACVLAN, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (OLPC_MESH,
@ -7928,6 +8088,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (IP4_CONFIG, FALSE),
NM_META_SETTING_VALID_PART_ITEM (IP6_CONFIG, FALSE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (OVS_PATCH),
@ -7947,6 +8108,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (WIRED, TRUE),
NM_META_SETTING_VALID_PART_ITEM (PPP, FALSE),
NM_META_SETTING_VALID_PART_ITEM (802_1X, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (PPP),
@ -7961,6 +8123,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (TEAM, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (TEAM_PORT),
@ -7969,6 +8132,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (TUN, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
.setting_init_fcn = _setting_init_fcn_tun,
),
@ -7978,6 +8142,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (VLAN, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
.setting_init_fcn = _setting_init_fcn_vlan,
),
@ -7992,6 +8157,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (VXLAN, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (WIMAX,
@ -8008,6 +8174,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (802_1X, FALSE),
NM_META_SETTING_VALID_PART_ITEM (DCB, FALSE),
NM_META_SETTING_VALID_PART_ITEM (SRIOV, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
),
SETTING_INFO (WIRELESS,
@ -8017,6 +8184,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
NM_META_SETTING_VALID_PART_ITEM (WIRELESS, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRELESS_SECURITY, FALSE),
NM_META_SETTING_VALID_PART_ITEM (802_1X, FALSE),
NM_META_SETTING_VALID_PART_ITEM (ETHTOOL, FALSE),
),
.setting_init_fcn = _setting_init_fcn_wireless,
),

View file

@ -22,6 +22,7 @@
#include "nm-utils/nm-obj.h"
#include "nm-meta-setting.h"
#include "nm-ethtool-utils.h"
struct _NMDevice;
@ -147,6 +148,11 @@ typedef enum {
typedef enum {
NM_META_ACCESSOR_GET_OUT_FLAGS_NONE = 0,
NM_META_ACCESSOR_GET_OUT_FLAGS_STRV = (1LL << 0),
/* the property allows to be hidden, if and only if, it's value is set to the
* default. This should only be set by new properties, to preserve behavior
* of old properties, which were always printed. */
NM_META_ACCESSOR_GET_OUT_FLAGS_HIDE = (1LL << 1),
} NMMetaAccessorGetOutFlags;
typedef enum {
@ -263,6 +269,9 @@ struct _NMMetaPropertyTypData {
struct {
NMMetaPropertyTypeMacMode mode;
} mac;
struct {
NMEthtoolID ethtool_id;
} ethtool;
} subtype;
const char *const*values_static;
const NMMetaPropertyTypDataNested *nested;

View file

@ -202,6 +202,7 @@ print ("NetworkManager version " + client.get_version())]]></programlisting></in
<xi:include href="xml/nm-setting-cdma.xml"/>
<xi:include href="xml/nm-setting-dcb.xml"/>
<xi:include href="xml/nm-setting-dummy.xml"/>
<xi:include href="xml/nm-setting-ethtool.xml"/>
<xi:include href="xml/nm-setting-generic.xml"/>
<xi:include href="xml/nm-setting-gsm.xml"/>
<xi:include href="xml/nm-setting-infiniband.xml"/>

View file

@ -69,6 +69,7 @@ libnm_core_settings_sources = files(
'nm-setting-connection.c',
'nm-setting-dcb.c',
'nm-setting-dummy.c',
'nm-setting-ethtool.c',
'nm-setting-generic.c',
'nm-setting-gsm.c',
'nm-setting-infiniband.c',
@ -153,7 +154,8 @@ endif
libnm_core_sources_all = libnm_core_sources
libnm_core_sources_all += libnm_core_enum
libnm_core_sources_all += shared_nm_utils_nm_meta_setting_c
libnm_core_sources_all += shared_nm_meta_setting_c
libnm_core_sources_all += shared_nm_ethtool_utils_c
libnm_core_sources_all += shared_files_libnm_core
libnm_core_sources_all += [version_header]

View file

@ -84,6 +84,7 @@
#include "nm-vpn-dbus-interface.h"
#include "nm-core-types-internal.h"
#include "nm-vpn-editor-plugin.h"
#include "nm-meta-setting.h"
/* IEEE 802.1D-1998 timer values */
#define NM_BR_MIN_HELLO_TIME 1
@ -168,49 +169,43 @@ NMConnection *_nm_simple_connection_new_from_dbus (GVariant *dict,
NMSettingParseFlags parse_flags,
GError **error);
/*
* A setting's priority should roughly follow the OSI layer model, but it also
* controls which settings get asked for secrets first. Thus settings which
* relate to things that must be working first, like hardware, should get a
* higher priority than things which layer on top of the hardware. For example,
* the GSM/CDMA settings should provide secrets before the PPP setting does,
* because a PIN is required to unlock the device before PPP can even start.
* Even settings without secrets should be assigned the right priority.
*
* 0: reserved for invalid
*
* 1: reserved for the Connection setting
*
* 2,3: hardware-related settings like Ethernet, Wi-Fi, InfiniBand, Bridge, etc.
* These priority 1 settings are also "base types", which means that at least
* one of them is required for the connection to be valid, and their name is
* valid in the 'type' property of the Connection setting.
*
* 4: hardware-related auxiliary settings that require a base setting to be
* successful first, like Wi-Fi security, 802.1x, etc.
*
* 5: hardware-independent settings that are required before IP connectivity
* can be established, like PPP, PPPoE, etc.
*
* 6: IP-level stuff
*
* 10: NMSettingUser
*/
typedef enum { /*< skip >*/
NM_SETTING_PRIORITY_INVALID = 0,
NM_SETTING_PRIORITY_CONNECTION = 1,
NM_SETTING_PRIORITY_HW_BASE = 2,
NM_SETTING_PRIORITY_HW_NON_BASE = 3,
NM_SETTING_PRIORITY_HW_AUX = 4,
NM_SETTING_PRIORITY_AUX = 5,
NM_SETTING_PRIORITY_IP = 6,
NM_SETTING_PRIORITY_USER = 10,
} NMSettingPriority;
NMSettingPriority _nm_setting_get_setting_priority (NMSetting *setting);
gboolean _nm_setting_get_property (NMSetting *setting, const char *name, GValue *value);
/*****************************************************************************/
GHashTable *_nm_setting_gendata_hash (NMSetting *setting,
gboolean create_if_necessary);
void _nm_setting_gendata_notify (NMSetting *setting,
gboolean keys_changed);
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);
/*****************************************************************************/
guint nm_setting_ethtool_init_features (NMSettingEthtool *setting,
NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */);
/*****************************************************************************/
#define NM_UTILS_HWADDR_LEN_MAX_STR (NM_UTILS_HWADDR_LEN_MAX * 3)
guint8 *_nm_utils_hwaddr_aton (const char *asc, gpointer buffer, gsize buffer_length, gsize *out_length);
@ -255,15 +250,6 @@ GPtrArray *_nm_utils_copy_object_array (const GPtrArray *array);
gssize _nm_utils_ptrarray_find_first (gconstpointer *list, gssize len, gconstpointer needle);
gssize _nm_utils_ptrarray_find_binary_search (gconstpointer *list,
gsize len,
gconstpointer needle,
GCompareDataFunc cmpfcn,
gpointer user_data,
gssize *out_idx_first,
gssize *out_idx_last);
gssize _nm_utils_array_find_binary_search (gconstpointer list, gsize elem_size, gsize len, gconstpointer needle, GCompareDataFunc cmpfcn, gpointer user_data);
GSList * _nm_utils_strv_to_slist (char **strv, gboolean deep_copy);
char ** _nm_utils_slist_to_strv (GSList *slist, gboolean deep_copy);
@ -526,4 +512,77 @@ gboolean _nm_utils_dhcp_duid_valid (const char *duid, GBytes **out_duid_bin);
gboolean _nm_setting_sriov_sort_vfs (NMSettingSriov *setting);
/*****************************************************************************/
typedef struct _NMSettInfoSetting NMSettInfoSetting;
typedef GVariant *(*NMSettingPropertyGetFunc) (NMSetting *setting,
const char *property);
typedef GVariant *(*NMSettingPropertySynthFunc) (NMSetting *setting,
NMConnection *connection,
const char *property);
typedef gboolean (*NMSettingPropertySetFunc) (NMSetting *setting,
GVariant *connection_dict,
const char *property,
GVariant *value,
NMSettingParseFlags parse_flags,
GError **error);
typedef gboolean (*NMSettingPropertyNotSetFunc) (NMSetting *setting,
GVariant *connection_dict,
const char *property,
NMSettingParseFlags parse_flags,
GError **error);
typedef GVariant *(*NMSettingPropertyTransformToFunc) (const GValue *from);
typedef void (*NMSettingPropertyTransformFromFunc) (GVariant *from,
GValue *to);
typedef struct {
const char *name;
GParamSpec *param_spec;
const GVariantType *dbus_type;
NMSettingPropertyGetFunc get_func;
NMSettingPropertySynthFunc synth_func;
NMSettingPropertySetFunc set_func;
NMSettingPropertyNotSetFunc not_set_func;
NMSettingPropertyTransformToFunc to_dbus;
NMSettingPropertyTransformFromFunc from_dbus;
} NMSettInfoProperty;
typedef struct {
const GVariantType *(*get_variant_type) (const struct _NMSettInfoSetting *sett_info,
const char *name,
GError **error);
} NMSettInfoSettGendata;
typedef struct {
/* if set, then this setting class has no own fields. Instead, its
* data is entirely based on gendata. Meaning: it tracks all data
* as native GVariants.
* It might have some GObject properties, but these are merely accessors
* to the underlying gendata.
*
* Note, that at the moment there are few hooks, to customize the behavior
* of the setting further. They are currently unneeded. This is desired,
* but could be added when there is a good reason.
*
* However, a few hooks there are... see NMSettInfoSettGendata. */
const NMSettInfoSettGendata *gendata_info;
} NMSettInfoSettDetail;
struct _NMSettInfoSetting {
NMSettingClass *setting_class;
const NMSettInfoProperty *property_infos;
guint property_infos_len;
NMSettInfoSettDetail detail;
};
const NMSettInfoSetting *_nm_sett_info_setting_get (NMSettingClass *setting_class);
const NMSettInfoProperty *_nm_sett_info_property_get (NMSettingClass *setting_class,
const char *property_name);
/*****************************************************************************/
#endif

View file

@ -40,6 +40,7 @@ typedef struct _NMSettingCdma NMSettingCdma;
typedef struct _NMSettingConnection NMSettingConnection;
typedef struct _NMSettingDcb NMSettingDcb;
typedef struct _NMSettingDummy NMSettingDummy;
typedef struct _NMSettingEthtool NMSettingEthtool;
typedef struct _NMSettingGeneric NMSettingGeneric;
typedef struct _NMSettingGsm NMSettingGsm;
typedef struct _NMSettingInfiniband NMSettingInfiniband;

View file

@ -2096,18 +2096,16 @@ typedef struct {
})
typedef struct {
const char *setting_name;
const ParseInfoProperty*const*properties;
} ParseInfoSetting;
#define PARSE_INFO_SETTING(_setting_name, ...) \
{ \
.setting_name = _setting_name, \
#define PARSE_INFO_SETTING(setting_type, ...) \
[setting_type] = (&((const ParseInfoSetting) { \
__VA_ARGS__ \
}
}))
static const ParseInfoSetting parse_infos[] = {
PARSE_INFO_SETTING (NM_SETTING_WIRELESS_SETTING_NAME,
static const ParseInfoSetting *const parse_infos[_NM_META_SETTING_TYPE_NUM] = {
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_WIRELESS,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_WIRELESS_BSSID,
.parser = mac_address_parser_ETHER,
@ -2124,7 +2122,7 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_802_1X_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_802_1X,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_802_1X_CA_CERT,
.parser = cert_parser,
@ -2156,7 +2154,7 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_WIRED_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_WIRED,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
.parser = mac_address_parser_ETHER_cloned,
@ -2166,28 +2164,28 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_BLUETOOTH_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_BLUETOOTH,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_BLUETOOTH_BDADDR,
.parser = mac_address_parser_ETHER,
),
),
),
PARSE_INFO_SETTING (NM_SETTING_BOND_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_BOND,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_BOND_OPTIONS,
.parser_no_check_key = TRUE,
),
),
),
PARSE_INFO_SETTING (NM_SETTING_BRIDGE_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_BRIDGE,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_BRIDGE_MAC_ADDRESS,
.parser = mac_address_parser_ETHER,
),
),
),
PARSE_INFO_SETTING (NM_SETTING_CONNECTION_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_CONNECTION,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_CONNECTION_READ_ONLY,
.parser_skip = TRUE,
@ -2199,14 +2197,14 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_INFINIBAND_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_INFINIBAND,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_INFINIBAND_MAC_ADDRESS,
.parser = mac_address_parser_INFINIBAND,
),
),
),
PARSE_INFO_SETTING (NM_SETTING_IP4_CONFIG_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_IP4_CONFIG,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_IP_CONFIG_ADDRESSES,
.parser_no_check_key = TRUE,
@ -2228,7 +2226,7 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_IP6_CONFIG_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_IP6_CONFIG,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE,
.parser_no_check_key = TRUE,
@ -2256,14 +2254,14 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_SERIAL_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_SERIAL,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_SERIAL_PARITY,
.parser = parity_parser,
),
),
),
PARSE_INFO_SETTING (NM_SETTING_SRIOV_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_SRIOV,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_SRIOV_VFS,
.parser_no_check_key = TRUE,
@ -2272,7 +2270,7 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_TC_CONFIG_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_TC_CONFIG,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_TC_CONFIG_QDISCS,
.parser_no_check_key = TRUE,
@ -2286,7 +2284,7 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_TEAM_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_TEAM,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_CONFIG,
.parser = team_config_parser,
@ -2353,7 +2351,7 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_TEAM_PORT_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_TEAM_PORT,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_CONFIG,
.parser = team_config_parser,
@ -2384,21 +2382,21 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_USER_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_USER,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_USER_DATA,
.parser_no_check_key = TRUE,
),
),
),
PARSE_INFO_SETTING (NM_SETTING_VLAN_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_VLAN,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_VLAN_FLAGS,
.writer_persist_default = TRUE,
),
),
),
PARSE_INFO_SETTING (NM_SETTING_VPN_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_VPN,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_VPN_DATA,
.parser_no_check_key = TRUE,
@ -2420,7 +2418,7 @@ static const ParseInfoSetting parse_infos[] = {
),
),
),
PARSE_INFO_SETTING (NM_SETTING_WIMAX_SETTING_NAME,
PARSE_INFO_SETTING (NM_META_SETTING_TYPE_WIMAX,
PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_WIMAX_MAC_ADDRESS,
.parser = mac_address_parser_ETHER,
@ -2430,21 +2428,24 @@ static const ParseInfoSetting parse_infos[] = {
};
static const ParseInfoProperty *
_parse_info_find (const char *setting_name, const char *property_name)
_parse_info_find (NMSetting *setting,
const char *property_name,
const char **out_setting_name)
{
const NMMetaSettingInfo *setting_info;
const ParseInfoSetting *pis;
gssize idx;
#if NM_MORE_ASSERTS > 5
#if NM_MORE_ASSERTS > 10
{
guint i, j;
for (i = 0; i < G_N_ELEMENTS (parse_infos); i++) {
const ParseInfoSetting *pis = &parse_infos[i];
pis = parse_infos[i];
if (!pis)
continue;
g_assert (pis->setting_name);
if ( i > 0
&& strcmp (pis[-1].setting_name, pis->setting_name) >= 0)
g_error ("Wrong order at index #%d: \"%s\" before \"%s\"", i - 1, pis[-1].setting_name, pis->setting_name);
g_assert (pis->properties);
g_assert (pis->properties[0]);
for (j = 0; pis->properties[j]; j++) {
@ -2454,32 +2455,35 @@ _parse_info_find (const char *setting_name, const char *property_name)
g_assert (pip->property_name);
if ( j > 0
&& (pip0 = pis->properties[j - 1])
&& strcmp (pip0->property_name, pip->property_name) >= 0)
g_error ("Wrong order at index #%d.%d: \"%s.%s\" before \"%s.%s\"", i, j - 1, pis->setting_name, pip0->property_name, pis->setting_name, pip->property_name);
&& strcmp (pip0->property_name, pip->property_name) >= 0) {
g_error ("Wrong order at index #%d.%d: \"%s.%s\" before \"%s.%s\"",
i, j - 1,
nm_meta_setting_infos[i].setting_name, pip0->property_name,
nm_meta_setting_infos[i].setting_name, pip->property_name);
}
}
}
}
#endif
G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (ParseInfoSetting, setting_name) == 0);
idx = _nm_utils_array_find_binary_search (parse_infos,
sizeof (ParseInfoSetting),
G_N_ELEMENTS (parse_infos),
&setting_name,
nm_strcmp_p_with_data,
NULL);
if (idx >= 0) {
const ParseInfoSetting *pis = &parse_infos[idx];
if ( !NM_IS_SETTING (setting)
|| !(setting_info = NM_SETTING_GET_CLASS (setting)->setting_info)) {
/* handle invalid setting objects gracefully. */
*out_setting_name = NULL;
return NULL;
}
*out_setting_name = setting_info->setting_name;
if ((pis = parse_infos[setting_info->meta_type])) {
G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (ParseInfoProperty, property_name) == 0);
nm_assert (nm_streq (pis->setting_name, setting_name));
idx = _nm_utils_ptrarray_find_binary_search ((gconstpointer *) pis->properties,
NM_PTRARRAY_LEN (pis->properties),
&property_name,
nm_strcmp_p_with_data,
NULL,
NULL,
NULL);
idx = nm_utils_ptrarray_find_binary_search ((gconstpointer *) pis->properties,
NM_PTRARRAY_LEN (pis->properties),
&property_name,
nm_strcmp_p_with_data,
NULL,
NULL,
NULL);
if (idx >= 0)
return pis->properties[idx];
}
@ -2510,9 +2514,9 @@ read_one_setting_value (NMSetting *setting,
if (!(flags & G_PARAM_WRITABLE))
return;
setting_name = nm_setting_get_name (setting);
pip = _parse_info_find (setting, key, &setting_name);
pip = _parse_info_find (setting_name, key);
nm_assert (setting_name);
if ( !pip
&& nm_streq (key, NM_SETTING_NAME))
@ -2680,6 +2684,8 @@ read_one_setting_value (NMSetting *setting,
static NMSetting *
read_setting (KeyfileReaderInfo *info)
{
const NMSettInfoSetting *sett_info;
gs_unref_object NMSetting *setting = NULL;
const char *alias;
GType type;
@ -2688,22 +2694,92 @@ read_setting (KeyfileReaderInfo *info)
alias = info->group;
type = nm_setting_lookup_type (alias);
if (type) {
NMSetting *setting = g_object_new (type, NULL);
info->setting = setting;
nm_setting_enumerate_values (setting, read_one_setting_value, info);
info->setting = NULL;
if (!info->error)
return setting;
g_object_unref (setting);
} else {
if (!type) {
handle_warn (info, NULL, NM_KEYFILE_WARN_SEVERITY_WARN,
_("invalid setting name '%s'"), info->group);
return NULL;
}
return NULL;
setting = g_object_new (type, NULL);
info->setting = setting;
sett_info = _nm_sett_info_setting_get (NM_SETTING_GET_CLASS (setting));
if (sett_info->detail.gendata_info) {
gs_free char **keys = NULL;
gsize i, n_keys;
keys = g_key_file_get_keys (info->keyfile, info->group, &n_keys, NULL);
if (n_keys > 0) {
GHashTable *h = _nm_setting_gendata_hash (setting, TRUE);
nm_utils_strv_sort (keys, n_keys);
for (i = 0; i < n_keys; i++) {
gs_free char *key = keys[i];
gs_free_error GError *local = NULL;
const GVariantType *variant_type;
GVariant *variant;
/* a GKeyfile can return duplicate keys, there is just no API to make sense
* of them. Skip them. */
if ( i + 1 < n_keys
&& nm_streq (key, keys[i + 1]))
continue;
/* currently, the API is very simple. The setting class just returns
* the desired variant type, and keyfile reader will try to parse
* it accordingly. Note, that this does currently not allow, that
* a particular key can contain different variant types, nor is it
* very flexible in general.
*
* We add flexibility when we need it. Keep it simple for now. */
variant_type = sett_info->detail.gendata_info->get_variant_type (sett_info,
key,
&local);
if (!variant_type) {
if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
_("invalid key '%s.%s'"),
info->group, key))
break;
continue;
}
if (g_variant_type_equal (variant_type, G_VARIANT_TYPE_BOOLEAN)) {
gboolean v;
v = g_key_file_get_boolean (info->keyfile,
info->group,
key,
&local);
if (local) {
if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
_("key '%s.%s' is not boolean"),
info->group, key))
break;
continue;
}
variant = g_variant_new_boolean (v);
} else {
nm_assert_not_reached ();
continue;
}
g_hash_table_insert (h,
g_steal_pointer (&key),
g_variant_take_ref (variant));
}
for (; i < n_keys; i++)
g_free (keys[i]);
}
} else
nm_setting_enumerate_values (setting, read_one_setting_value, info);
info->setting = NULL;
if (info->error)
return NULL;
return g_steal_pointer (&setting);
}
static void
@ -2778,7 +2854,7 @@ nm_keyfile_read (GKeyFile *keyfile,
base_dir = base_dir_free = g_get_current_dir ();
}
} else
g_return_val_if_fail ("/", NULL);
g_return_val_if_fail (base_dir[0] == '/', NULL);
connection = nm_simple_connection_new ();
@ -2884,12 +2960,22 @@ write_setting_value (NMSetting *setting,
if (info->error)
return;
setting_name = nm_setting_get_name (setting);
pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), key);
nm_assert (pspec);
pip = _parse_info_find (setting_name, key);
pip = _parse_info_find (setting, key, &setting_name);
if (!setting_name) {
/* the setting type is unknown. That is highly unexpected
* (and as this is currently only called from NetworkManager
* daemon, not possible).
*
* Still, handle it gracefully, because later keyfile writer will become
* public API of libnm, where @setting is (untrusted) user input.
*
* Gracefully here just means: ignore the setting. */
return;
}
if ( !pip
&& nm_streq (key, NM_SETTING_NAME))
@ -2984,6 +3070,8 @@ nm_keyfile_write (NMConnection *connection,
GError **error)
{
KeyfileWriterInfo info = { 0 };
gs_free NMSetting **settings = NULL;
guint i, length = 0;
g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
g_return_val_if_fail (!error || !*error, NULL);
@ -2996,12 +3084,59 @@ nm_keyfile_write (NMConnection *connection,
info.error = NULL;
info.handler = handler;
info.user_data = user_data;
nm_connection_for_each_setting_value (connection, write_setting_value, &info);
settings = nm_connection_get_settings (connection, &length);
for (i = 0; i < length; i++) {
const NMSettInfoSetting *sett_info;
NMSetting *setting = settings[i];
sett_info = _nm_sett_info_setting_get (NM_SETTING_GET_CLASS (setting));
if (sett_info->detail.gendata_info) {
guint k, n_keys;
const char *const*keys;
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);
if (n_keys > 0) {
const char *setting_name = sett_info->setting_class->setting_info->setting_name;
GHashTable *h = _nm_setting_gendata_hash (setting, FALSE);
for (k = 0; k < n_keys; k++) {
const char *key = keys[k];
GVariant *v;
v = g_hash_table_lookup (h, key);
if (g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN)) {
g_key_file_set_boolean (info.keyfile,
setting_name,
key,
g_variant_get_boolean (v));
} else {
/* BUG: The variant type is not implemented. Since the connection
* verifies, this can only mean we either wrongly didn't reject
* the connection as invalid, or we didn't properly implement the
* variant type. */
nm_assert_not_reached ();
continue;
}
}
}
} else
nm_setting_enumerate_values (setting, write_setting_value, &info);
if (info.error)
break;
}
if (info.error) {
g_propagate_error (error, info.error);
g_key_file_unref (info.keyfile);
return NULL;
}
return info.keyfile;
}

View file

@ -51,8 +51,7 @@ struct _NMSetting6LowpanClass {
* necessary for connection to 6LoWPAN interfaces.
**/
G_DEFINE_TYPE_WITH_CODE (NMSetting6Lowpan, nm_setting_6lowpan, NM_TYPE_SETTING,
_nm_register_setting (6LOWPAN, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSetting6Lowpan, nm_setting_6lowpan, NM_TYPE_SETTING)
#define NM_SETTING_6LOWPAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_6LOWPAN, NMSetting6LowpanPrivate))
@ -196,17 +195,18 @@ finalize (GObject *object)
}
static void
nm_setting_6lowpan_class_init (NMSetting6LowpanClass *setting_class)
nm_setting_6lowpan_class_init (NMSetting6LowpanClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSetting6LowpanPrivate));
g_type_class_add_private (klass, sizeof (NMSetting6LowpanPrivate));
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
setting_class->verify = verify;
/**
* NMSetting6Lowpan:parent:
@ -225,4 +225,6 @@ nm_setting_6lowpan_class_init (NMSetting6LowpanClass *setting_class)
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_6LOWPAN);
}

View file

@ -60,8 +60,7 @@
* ISBN: 978-1587051548
**/
G_DEFINE_TYPE_WITH_CODE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING,
_nm_register_setting (802_1X, NM_SETTING_PRIORITY_HW_AUX))
G_DEFINE_TYPE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING)
#define NM_SETTING_802_1X_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_802_1X, NMSetting8021xPrivate))
@ -3761,22 +3760,19 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_802_1x_class_init (NMSetting8021xClass *setting_class)
nm_setting_802_1x_class_init (NMSetting8021xClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSetting8021xPrivate));
g_type_class_add_private (klass, sizeof (NMSetting8021xPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->need_secrets = need_secrets;
/* Properties */
setting_class->verify = verify;
setting_class->need_secrets = need_secrets;
/**
* NMSetting8021x:eap:
@ -4806,4 +4802,6 @@ nm_setting_802_1x_class_init (NMSetting8021xClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_FUZZY_IGNORE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_802_1X);
}

View file

@ -37,8 +37,7 @@
* properties of ADSL connections.
*/
G_DEFINE_TYPE_WITH_CODE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING,
_nm_register_setting (ADSL, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING)
#define NM_SETTING_ADSL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_ADSL, NMSettingAdslPrivate))
@ -345,22 +344,20 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_adsl_class_init (NMSettingAdslClass *setting_class)
nm_setting_adsl_class_init (NMSettingAdslClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingAdslPrivate));
g_type_class_add_private (klass, sizeof (NMSettingAdslPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->verify_secrets = verify_secrets;
parent_class->need_secrets = need_secrets;
/* Properties */
setting_class->verify = verify;
setting_class->verify_secrets = verify_secrets;
setting_class->need_secrets = need_secrets;
/**
* NMSettingAdsl:username:
@ -447,4 +444,6 @@ nm_setting_adsl_class_init (NMSettingAdslClass *setting_class)
0, 65536, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_ADSL);
}

View file

@ -43,8 +43,7 @@
* Point (NAP) profiles.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING,
_nm_register_setting (BLUETOOTH, NM_SETTING_PRIORITY_HW_NON_BASE))
G_DEFINE_TYPE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING)
#define NM_SETTING_BLUETOOTH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BLUETOOTH, NMSettingBluetoothPrivate))
@ -282,20 +281,19 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_bluetooth_class_init (NMSettingBluetoothClass *setting_class)
nm_setting_bluetooth_class_init (NMSettingBluetoothClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingBluetoothPrivate));
g_type_class_add_private (klass, sizeof (NMSettingBluetoothPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingBluetooth:bdaddr:
@ -309,10 +307,13 @@ nm_setting_bluetooth_class_init (NMSettingBluetoothClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_BLUETOOTH_BDADDR,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_BLUETOOTH_BDADDR),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
/**
* NMSettingBluetooth:type:
@ -327,4 +328,7 @@ nm_setting_bluetooth_class_init (NMSettingBluetoothClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_BLUETOOTH,
NULL, properties_override);
}

View file

@ -57,8 +57,7 @@ typedef struct {
NMUtilsNamedValue *options_idx_cache;
} NMSettingBondPrivate;
G_DEFINE_TYPE_WITH_CODE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING,
_nm_register_setting (BOND, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING)
#define NM_SETTING_BOND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BOND, NMSettingBondPrivate))
@ -872,7 +871,7 @@ compare_property (NMSetting *setting,
const GParamSpec *prop_spec,
NMSettingCompareFlags flags)
{
NMSettingClass *parent_class;
NMSettingClass *setting_class;
if (nm_streq0 (prop_spec->name, NM_SETTING_BOND_OPTIONS)) {
return options_equal (NM_SETTING_BOND (setting),
@ -881,9 +880,8 @@ compare_property (NMSetting *setting,
flags);
}
/* Otherwise chain up to parent to handle generic compare */
parent_class = NM_SETTING_CLASS (nm_setting_bond_parent_class);
return parent_class->compare_property (setting, other, prop_spec, flags);
setting_class = NM_SETTING_CLASS (nm_setting_bond_parent_class);
return setting_class->compare_property (setting, other, prop_spec, flags);
}
/*****************************************************************************/
@ -960,21 +958,21 @@ finalize (GObject *object)
}
static void
nm_setting_bond_class_init (NMSettingBondClass *setting_class)
nm_setting_bond_class_init (NMSettingBondClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingBondPrivate));
g_type_class_add_private (klass, sizeof (NMSettingBondPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->compare_property = compare_property;
/* Properties */
setting_class->verify = verify;
setting_class->compare_property = compare_property;
/**
* NMSettingBond:options: (type GHashTable(utf8,utf8)):
*
@ -996,10 +994,13 @@ nm_setting_bond_class_init (NMSettingBondClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_BOND_OPTIONS,
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_BOND_OPTIONS),
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
/* ---dbus---
* property: interface-name
@ -1009,8 +1010,12 @@ nm_setting_bond_class_init (NMSettingBondClass *setting_class)
* bond's interface name.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (parent_class, "interface-name",
G_VARIANT_TYPE_STRING,
_nm_setting_get_deprecated_virtual_interface_name,
NULL);
_properties_override_add_dbus_only (properties_override,
"interface-name",
G_VARIANT_TYPE_STRING,
_nm_setting_get_deprecated_virtual_interface_name,
NULL);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_BOND,
NULL, properties_override);
}

View file

@ -40,8 +40,7 @@
* optional properties that apply to bridge ports.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingBridgePort, nm_setting_bridge_port, NM_TYPE_SETTING,
_nm_register_setting (BRIDGE_PORT, NM_SETTING_PRIORITY_AUX))
G_DEFINE_TYPE (NMSettingBridgePort, nm_setting_bridge_port, NM_TYPE_SETTING)
#define NM_SETTING_BRIDGE_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePortPrivate))
@ -211,19 +210,18 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_bridge_port_class_init (NMSettingBridgePortClass *setting_class)
nm_setting_bridge_port_class_init (NMSettingBridgePortClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingBridgePortPrivate));
g_type_class_add_private (klass, sizeof (NMSettingBridgePortPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingBridgePort:priority:
*
@ -289,4 +287,6 @@ nm_setting_bridge_port_class_init (NMSettingBridgePortClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_BRIDGE_PORT);
}

View file

@ -38,8 +38,7 @@
* necessary for bridging connections.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingBridge, nm_setting_bridge, NM_TYPE_SETTING,
_nm_register_setting (BRIDGE, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingBridge, nm_setting_bridge, NM_TYPE_SETTING)
#define NM_SETTING_BRIDGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BRIDGE, NMSettingBridgePrivate))
@ -392,20 +391,20 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingBridgePrivate));
g_type_class_add_private (klass, sizeof (NMSettingBridgePrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingBridge:mac-address:
*
@ -443,10 +442,13 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_BRIDGE_MAC_ADDRESS,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_BRIDGE_MAC_ADDRESS),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
/**
* NMSettingBridge:stp:
@ -637,8 +639,12 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
* bridge's interface name.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (parent_class, "interface-name",
G_VARIANT_TYPE_STRING,
_nm_setting_get_deprecated_virtual_interface_name,
NULL);
_properties_override_add_dbus_only (properties_override,
"interface-name",
G_VARIANT_TYPE_STRING,
_nm_setting_get_deprecated_virtual_interface_name,
NULL);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_BRIDGE,
NULL, properties_override);
}

View file

@ -37,8 +37,7 @@
* networks, including those using CDMA2000/EVDO technology.
*/
G_DEFINE_TYPE_WITH_CODE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING,
_nm_register_setting (CDMA, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING)
#define NM_SETTING_CDMA_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CDMA, NMSettingCdmaPrivate))
@ -284,22 +283,20 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_cdma_class_init (NMSettingCdmaClass *setting_class)
nm_setting_cdma_class_init (NMSettingCdmaClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingCdmaPrivate));
g_type_class_add_private (klass, sizeof (NMSettingCdmaPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->verify_secrets = verify_secrets;
parent_class->need_secrets = need_secrets;
/* Properties */
setting_class->verify = verify;
setting_class->verify_secrets = verify_secrets;
setting_class->need_secrets = need_secrets;
/**
* NMSettingCdma:number:
@ -374,4 +371,5 @@ nm_setting_cdma_class_init (NMSettingCdmaClass *setting_class)
NM_SETTING_PARAM_FUZZY_IGNORE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_CDMA);
}

View file

@ -45,8 +45,7 @@
* a #NMSettingConnection setting.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING,
_nm_register_setting (CONNECTION, NM_SETTING_PRIORITY_CONNECTION))
G_DEFINE_TYPE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING)
#define NM_SETTING_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CONNECTION, NMSettingConnectionPrivate))
@ -1268,7 +1267,6 @@ compare_property (NMSetting *setting,
&& g_strcmp0 (prop_spec->name, NM_SETTING_CONNECTION_TIMESTAMP) == 0)
return TRUE;
/* Otherwise chain up to parent to handle generic compare */
return NM_SETTING_CLASS (nm_setting_connection_parent_class)->compare_property (setting, other, prop_spec, flags);
}
@ -1503,21 +1501,20 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
nm_setting_connection_class_init (NMSettingConnectionClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingConnectionPrivate));
g_type_class_add_private (klass, sizeof (NMSettingConnectionPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->compare_property = compare_property;
/* Properties */
setting_class->verify = verify;
setting_class->compare_property = compare_property;
/**
* NMSettingConnection:id:
@ -1654,11 +1651,14 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (parent_class, NM_SETTING_CONNECTION_INTERFACE_NAME,
G_VARIANT_TYPE_STRING,
NULL,
nm_setting_connection_set_interface_name,
nm_setting_connection_no_interface_name);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_CONNECTION_INTERFACE_NAME),
G_VARIANT_TYPE_STRING,
NULL,
nm_setting_connection_set_interface_name,
nm_setting_connection_no_interface_name);
/**
* NMSettingConnection:type:
@ -2128,4 +2128,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
NM_SETTING_CONNECTION_MDNS_DEFAULT,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_CONNECTION,
NULL, properties_override);
}

View file

@ -40,8 +40,7 @@
* of storage technologies like Fibre Channel over Ethernet (FCoE) and iSCSI.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingDcb, nm_setting_dcb, NM_TYPE_SETTING,
_nm_register_setting (DCB, NM_SETTING_PRIORITY_HW_AUX))
G_DEFINE_TYPE (NMSettingDcb, nm_setting_dcb, NM_TYPE_SETTING)
#define NM_SETTING_DCB_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_DCB, NMSettingDcbPrivate))
@ -906,20 +905,20 @@ finalize (GObject *object)
}
static void
nm_setting_dcb_class_init (NMSettingDcbClass *setting_class)
nm_setting_dcb_class_init (NMSettingDcbClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingDcbPrivate));
g_type_class_add_private (klass, sizeof (NMSettingDcbPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingDcb:app-fcoe-flags:
*
@ -1118,10 +1117,13 @@ nm_setting_dcb_class_init (NMSettingDcbClass *setting_class)
G_TYPE_ARRAY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_DCB_PRIORITY_FLOW_CONTROL,
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_DCB_PRIORITY_FLOW_CONTROL),
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
/**
* NMSettingDcb:priority-group-flags:
@ -1166,10 +1168,13 @@ nm_setting_dcb_class_init (NMSettingDcbClass *setting_class)
G_TYPE_ARRAY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_DCB_PRIORITY_GROUP_ID,
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_DCB_PRIORITY_GROUP_ID),
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
/**
* NMSettingDcb:priority-group-bandwidth: (type GArray(guint))
@ -1192,10 +1197,13 @@ nm_setting_dcb_class_init (NMSettingDcbClass *setting_class)
G_TYPE_ARRAY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH,
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH),
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
/**
* NMSettingDcb:priority-bandwidth: (type GArray(guint))
@ -1220,10 +1228,13 @@ nm_setting_dcb_class_init (NMSettingDcbClass *setting_class)
G_TYPE_ARRAY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_DCB_PRIORITY_BANDWIDTH,
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_DCB_PRIORITY_BANDWIDTH),
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
/**
* NMSettingDcb:priority-strict-bandwidth: (type GArray(gboolean))
@ -1246,10 +1257,13 @@ nm_setting_dcb_class_init (NMSettingDcbClass *setting_class)
G_TYPE_ARRAY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH,
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH),
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
/**
* NMSettingDcb:priority-traffic-class: (type GArray(guint))
@ -1271,8 +1285,14 @@ nm_setting_dcb_class_init (NMSettingDcbClass *setting_class)
G_TYPE_ARRAY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS,
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS),
G_VARIANT_TYPE ("au"),
_nm_setting_dcb_uint_array_to_dbus,
_nm_setting_dcb_uint_array_from_dbus);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_DCB,
NULL, properties_override);
}

View file

@ -34,8 +34,7 @@
* necessary for connection to dummy devices
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingDummy, nm_setting_dummy, NM_TYPE_SETTING,
_nm_register_setting (DUMMY, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingDummy, nm_setting_dummy, NM_TYPE_SETTING)
/**
* nm_setting_dummy_new:
@ -67,9 +66,11 @@ nm_setting_dummy_init (NMSettingDummy *setting)
}
static void
nm_setting_dummy_class_init (NMSettingDummyClass *setting_class)
nm_setting_dummy_class_init (NMSettingDummyClass *klass)
{
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
parent_class->verify = verify;
setting_class->verify = verify;
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_DUMMY);
}

View file

@ -0,0 +1,342 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
* Copyright 2018 Red Hat, Inc.
*/
#include "nm-default.h"
#include "nm-setting-ethtool.h"
#include "nm-setting-private.h"
#include "nm-ethtool-utils.h"
/*****************************************************************************/
/**
* SECTION:nm-setting-ethtool
* @short_description: Describes connection properties for ethtool related options
*
* The #NMSettingEthtool object is a #NMSetting subclass that describes properties
* to control network driver and hardware settings.
**/
/*****************************************************************************/
/**
* nm_ethtool_optname_is_feature:
* @optname: the option name to check
*
* Checks whether @optname is a valid option name for an offload feature.
*
* %Returns: %TRUE, if @optname is valid
*
* Since: 1.14
*/
gboolean
nm_ethtool_optname_is_feature (const char *optname)
{
return optname && nm_ethtool_id_is_feature (nm_ethtool_id_get_by_name (optname));
}
/*****************************************************************************/
/**
* NMSettingEthtool:
*
* Ethtool Ethernet Settings
*
* Since: 1.14
*/
struct _NMSettingEthtool {
NMSetting parent;
};
struct _NMSettingEthtoolClass {
NMSettingClass parent;
};
G_DEFINE_TYPE (NMSettingEthtool, nm_setting_ethtool, NM_TYPE_SETTING)
#define NM_SETTING_ETHTOOL_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMSettingEthtool, NM_IS_SETTING_ETHTOOL, NMSetting)
/*****************************************************************************/
static void
_notify_attributes (NMSettingEthtool *self)
{
_nm_setting_gendata_notify (NM_SETTING (self), TRUE);
}
/*****************************************************************************/
/**
* nm_setting_ethtool_get_feature:
* @setting: the #NMSettingEthtool
* @optname: option name of the offload feature to get
*
* Gets and offload feature setting. Returns %NM_TERNARY_DEFAULT if the
* feature is not set.
*
* Returns: a #NMTernary value indicating whether the offload feature
* is enabled, disabled, or left untouched.
*
* Since: 1.14
*/
NMTernary
nm_setting_ethtool_get_feature (NMSettingEthtool *setting,
const char *optname)
{
GVariant *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;
}
/**
* nm_setting_ethtool_set_feature:
* @setting: the #NMSettingEthtool
* @optname: option name of the offload feature to get
* @value: the new value to set. The special value %NM_TERNARY_DEFAULT
* means to clear the offload feature setting.
*
* Sets and offload feature setting.
*
* Since: 1.14
*/
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);
}
/**
* nm_setting_ethtool_clear_features:
* @setting: the #NMSettingEthtool
*
* Clears all offload features settings
*
* Since: 1.14
*/
void
nm_setting_ethtool_clear_features (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_feature (name)) {
g_hash_table_iter_remove (&iter);
changed = TRUE;
}
}
if (changed)
_notify_attributes (setting);
}
guint
nm_setting_ethtool_init_features (NMSettingEthtool *setting,
NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */)
{
GHashTable *hash;
GHashTableIter iter;
guint i;
guint n_req = 0;
const char *name;
GVariant *variant;
nm_assert (NM_IS_SETTING_ETHTOOL (setting));
nm_assert (requested);
for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++)
requested[i] = NM_TERNARY_DEFAULT;
hash = _nm_setting_gendata_hash (NM_SETTING (setting), FALSE);
if (!hash)
return 0;
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_feature (ethtool_id))
continue;
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;
n_req++;
}
return n_req;
}
/*****************************************************************************/
static gboolean
verify (NMSetting *setting, NMConnection *connection, GError **error)
{
GHashTable *hash;
GHashTableIter iter;
const char *optname;
GVariant *variant;
hash = _nm_setting_gendata_hash (setting, FALSE);
if (!hash)
goto out;
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)) {
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;
}
}
out:
return TRUE;
}
/*****************************************************************************/
static const GVariantType *
get_variant_type (const NMSettInfoSetting *sett_info,
const char *name,
GError **error)
{
if (nm_ethtool_optname_is_feature (name))
return G_VARIANT_TYPE_BOOLEAN;
g_set_error (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
_("unknown ethtool option '%s'"),
name);
return NULL;
}
/*****************************************************************************/
static void
nm_setting_ethtool_init (NMSettingEthtool *setting)
{
}
/**
* nm_setting_ethtool_new:
*
* Creates a new #NMSettingEthtool object with default values.
*
* Returns: (transfer full): the new empty #NMSettingEthtool object
*
* Since: 1.14
**/
NMSetting *
nm_setting_ethtool_new (void)
{
return g_object_new (NM_TYPE_SETTING_ETHTOOL, NULL);
}
static void
nm_setting_ethtool_class_init (NMSettingEthtoolClass *klass)
{
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
setting_class->verify = verify;
_nm_setting_class_commit_full (setting_class,
NM_META_SETTING_TYPE_ETHTOOL,
NM_SETT_INFO_SETT_DETAIL (
.gendata_info = NM_SETT_INFO_SETT_GENDATA (
.get_variant_type = get_variant_type,
),
),
NULL);
}

View file

@ -0,0 +1,124 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
* Copyright 2018 Red Hat, Inc.
*/
#ifndef __NM_SETTING_ETHTOOL_H__
#define __NM_SETTING_ETHTOOL_H__
#if !defined (__NETWORKMANAGER_H_INSIDE__) && !defined (NETWORKMANAGER_COMPILATION)
#error "Only <NetworkManager.h> can be included directly."
#endif
#include "nm-setting.h"
G_BEGIN_DECLS
/*****************************************************************************/
#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD "feature-esp-hw-offload"
#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD "feature-esp-tx-csum-hw-offload"
#define NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU "feature-fcoe-mtu"
#define NM_ETHTOOL_OPTNAME_FEATURE_GRO "feature-gro"
#define NM_ETHTOOL_OPTNAME_FEATURE_GSO "feature-gso"
#define NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA "feature-highdma"
#define NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD "feature-hw-tc-offload"
#define NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD "feature-l2-fwd-offload"
#define NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK "feature-loopback"
#define NM_ETHTOOL_OPTNAME_FEATURE_LRO "feature-lro"
#define NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE "feature-ntuple"
#define NM_ETHTOOL_OPTNAME_FEATURE_RX "feature-rx"
#define NM_ETHTOOL_OPTNAME_FEATURE_RXHASH "feature-rxhash"
#define NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN "feature-rxvlan"
#define NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL "feature-rx-all"
#define NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS "feature-rx-fcs"
#define NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW "feature-rx-gro-hw"
#define NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD "feature-rx-udp_tunnel-port-offload"
#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER "feature-rx-vlan-filter"
#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER "feature-rx-vlan-stag-filter"
#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE "feature-rx-vlan-stag-hw-parse"
#define NM_ETHTOOL_OPTNAME_FEATURE_SG "feature-sg"
#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD "feature-tls-hw-record"
#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD "feature-tls-hw-tx-offload"
#define NM_ETHTOOL_OPTNAME_FEATURE_TSO "feature-tso"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX "feature-tx"
#define NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN "feature-txvlan"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC "feature-tx-checksum-fcoe-crc"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4 "feature-tx-checksum-ipv4"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6 "feature-tx-checksum-ipv6"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC "feature-tx-checksum-ip-generic"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP "feature-tx-checksum-sctp"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION "feature-tx-esp-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION "feature-tx-fcoe-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION "feature-tx-gre-csum-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION "feature-tx-gre-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL "feature-tx-gso-partial"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST "feature-tx-gso-robust"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION "feature-tx-ipxip4-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION "feature-tx-ipxip6-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY "feature-tx-nocache-copy"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER "feature-tx-scatter-gather"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST "feature-tx-scatter-gather-fraglist"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION "feature-tx-sctp-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION "feature-tx-tcp6-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION "feature-tx-tcp-ecn-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION "feature-tx-tcp-mangleid-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION "feature-tx-tcp-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION "feature-tx-udp-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION "feature-tx-udp_tnl-csum-segmentation"
#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"
gboolean nm_ethtool_optname_is_feature (const char *optname);
/*****************************************************************************/
#define NM_TYPE_SETTING_ETHTOOL (nm_setting_ethtool_get_type ())
#define NM_SETTING_ETHTOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_ETHTOOL, NMSettingEthtool))
#define NM_SETTING_ETHTOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_ETHTOOL, NMSettingEthtoolClass))
#define NM_IS_SETTING_ETHTOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_ETHTOOL))
#define NM_IS_SETTING_ETHTOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_ETHTOOL))
#define NM_SETTING_ETHTOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_ETHTOOL, NMSettingEthtoolClass))
#define NM_SETTING_ETHTOOL_SETTING_NAME "ethtool"
/*****************************************************************************/
typedef struct _NMSettingEthtoolClass NMSettingEthtoolClass;
NM_AVAILABLE_IN_1_14
GType nm_setting_ethtool_get_type (void);
NM_AVAILABLE_IN_1_14
NMSetting *nm_setting_ethtool_new (void);
/*****************************************************************************/
NM_AVAILABLE_IN_1_14
NMTernary nm_setting_ethtool_get_feature (NMSettingEthtool *setting,
const char *optname);
NM_AVAILABLE_IN_1_14
void nm_setting_ethtool_set_feature (NMSettingEthtool *setting,
const char *optname,
NMTernary value);
NM_AVAILABLE_IN_1_14
void nm_setting_ethtool_clear_features (NMSettingEthtool *setting);
G_END_DECLS
#endif /* __NM_SETTING_ETHTOOL_H__ */

View file

@ -36,8 +36,7 @@
* the "connection type" setting on #NMConnections for generic devices.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingGeneric, nm_setting_generic, NM_TYPE_SETTING,
_nm_register_setting (GENERIC, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingGeneric, nm_setting_generic, NM_TYPE_SETTING)
#define NM_SETTING_GENERIC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_GENERIC, NMSettingGenericPrivate))
@ -66,7 +65,11 @@ nm_setting_generic_init (NMSettingGeneric *setting)
}
static void
nm_setting_generic_class_init (NMSettingGenericClass *setting_class)
nm_setting_generic_class_init (NMSettingGenericClass *klass)
{
g_type_class_add_private (setting_class, sizeof (NMSettingGenericPrivate));
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (klass, sizeof (NMSettingGenericPrivate));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_GENERIC);
}

View file

@ -38,8 +38,7 @@
* networks, including those using GPRS/EDGE and UMTS/HSPA technology.
*/
G_DEFINE_TYPE_WITH_CODE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING,
_nm_register_setting (GSM, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING)
#define NM_SETTING_GSM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_GSM, NMSettingGsmPrivate))
@ -603,22 +602,21 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_gsm_class_init (NMSettingGsmClass *setting_class)
nm_setting_gsm_class_init (NMSettingGsmClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingGsmPrivate));
g_type_class_add_private (klass, sizeof (NMSettingGsmPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->verify_secrets = verify_secrets;
parent_class->need_secrets = need_secrets;
/* Properties */
setting_class->verify = verify;
setting_class->verify_secrets = verify_secrets;
setting_class->need_secrets = need_secrets;
/**
* NMSettingGsm:number:
@ -821,10 +819,18 @@ nm_setting_gsm_class_init (NMSettingGsmClass *setting_class)
G_PARAM_STATIC_STRINGS));
/* Ignore incoming deprecated properties */
_nm_setting_class_add_dbus_only_property (parent_class, "allowed-bands",
G_VARIANT_TYPE_UINT32,
NULL, NULL);
_nm_setting_class_add_dbus_only_property (parent_class, "network-type",
G_VARIANT_TYPE_INT32,
NULL, NULL);
_properties_override_add_dbus_only (properties_override,
"allowed-bands",
G_VARIANT_TYPE_UINT32,
NULL,
NULL);
_properties_override_add_dbus_only (properties_override,
"network-type",
G_VARIANT_TYPE_INT32,
NULL,
NULL);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_GSM,
NULL, properties_override);
}

View file

@ -37,8 +37,7 @@
* necessary for connection to IP-over-InfiniBand networks.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING,
_nm_register_setting (INFINIBAND, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING)
#define NM_SETTING_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_INFINIBAND, NMSettingInfinibandPrivate))
@ -377,21 +376,20 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_infiniband_class_init (NMSettingInfinibandClass *setting_class)
nm_setting_infiniband_class_init (NMSettingInfinibandClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingInfinibandPrivate));
g_type_class_add_private (klass, sizeof (NMSettingInfinibandPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
setting_class->verify = verify;
/* Properties */
/**
* NMSettingInfiniband:mac-address:
*
@ -424,10 +422,13 @@ nm_setting_infiniband_class_init (NMSettingInfinibandClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_INFINIBAND_MAC_ADDRESS,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_INFINIBAND_MAC_ADDRESS),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
/**
* NMSettingInfiniband:mtu:
@ -525,4 +526,6 @@ nm_setting_infiniband_class_init (NMSettingInfinibandClass *setting_class)
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_INFINIBAND,
NULL, properties_override);
}

View file

@ -2621,7 +2621,7 @@ compare_property (NMSetting *setting,
NMSettingCompareFlags flags)
{
NMSettingIPConfigPrivate *a_priv, *b_priv;
NMSettingClass *parent_class;
NMSettingClass *setting_class;
guint i;
if (nm_streq (prop_spec->name, NM_SETTING_IP_CONFIG_ADDRESSES)) {
@ -2650,9 +2650,8 @@ compare_property (NMSetting *setting,
return TRUE;
}
/* Otherwise chain up to parent to handle generic compare */
parent_class = NM_SETTING_CLASS (nm_setting_ip_config_parent_class);
return parent_class->compare_property (setting, other, prop_spec, flags);
setting_class = NM_SETTING_CLASS (nm_setting_ip_config_parent_class);
return setting_class->compare_property (setting, other, prop_spec, flags);
}
/*****************************************************************************/
@ -2879,22 +2878,37 @@ ip_gateway_set (NMSetting *setting,
return TRUE;
}
static void
nm_setting_ip_config_class_init (NMSettingIPConfigClass *setting_class)
GArray *
_nm_sett_info_property_override_create_array_ip_config (void)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
nm_auto_unref_gtypeclass NMSettingClass *setting_class = g_type_class_ref (NM_TYPE_SETTING_IP_CONFIG);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingIPConfigPrivate));
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_IP_CONFIG_GATEWAY),
G_VARIANT_TYPE_STRING,
NULL,
ip_gateway_set,
NULL);
return properties_override;
}
static void
nm_setting_ip_config_class_init (NMSettingIPConfigClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (klass, sizeof (NMSettingIPConfigPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->compare_property = compare_property;
/* Properties */
setting_class->verify = verify;
setting_class->compare_property = compare_property;
/**
* NMSettingIPConfig:method:
@ -3044,13 +3058,6 @@ nm_setting_ip_config_class_init (NMSettingIPConfigClass *setting_class)
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (parent_class,
NM_SETTING_IP_CONFIG_GATEWAY,
G_VARIANT_TYPE_STRING,
NULL,
ip_gateway_set,
NULL);
/**
* NMSettingIPConfig:routes: (type GPtrArray(NMIPRoute))
*

View file

@ -30,8 +30,7 @@
* @short_description: Describes connection properties for IP tunnel devices
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingIPTunnel, nm_setting_ip_tunnel, NM_TYPE_SETTING,
_nm_register_setting (IP_TUNNEL, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingIPTunnel, nm_setting_ip_tunnel, NM_TYPE_SETTING)
#define NM_SETTING_IP_TUNNEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP_TUNNEL, NMSettingIPTunnelPrivate))
@ -622,18 +621,18 @@ finalize (GObject *object)
}
static void
nm_setting_ip_tunnel_class_init (NMSettingIPTunnelClass *setting_class)
nm_setting_ip_tunnel_class_init (NMSettingIPTunnelClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingIPTunnelPrivate));
g_type_class_add_private (klass, sizeof (NMSettingIPTunnelPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
setting_class->verify = verify;
/**
* NMSettingIPTunnel:parent:
@ -851,4 +850,6 @@ nm_setting_ip_tunnel_class_init (NMSettingIPTunnelClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_FUZZY_IGNORE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_IP_TUNNEL);
}

View file

@ -50,8 +50,7 @@
* connection.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING_IP_CONFIG,
_nm_register_setting (IP4_CONFIG, NM_SETTING_PRIORITY_IP))
G_DEFINE_TYPE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING_IP_CONFIG)
#define NM_SETTING_IP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP4_CONFIG, NMSettingIP4ConfigPrivate))
@ -524,20 +523,19 @@ ip4_route_data_set (NMSetting *setting,
}
static void
nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *ip4_class)
nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *klass)
{
NMSettingClass *setting_class = NM_SETTING_CLASS (ip4_class);
GObjectClass *object_class = G_OBJECT_CLASS (ip4_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array_ip_config ();
g_type_class_add_private (setting_class, sizeof (NMSettingIP4ConfigPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
setting_class->verify = verify;
/* properties */
setting_class->verify = verify;
/* ---ifcfg-rh---
* property: method
@ -797,11 +795,12 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *ip4_class)
* integers)
* ---end---
*/
_nm_setting_class_transform_property (setting_class,
NM_SETTING_IP_CONFIG_DNS,
G_VARIANT_TYPE ("au"),
ip4_dns_to_dbus,
ip4_dns_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_IP_CONFIG_DNS),
G_VARIANT_TYPE ("au"),
ip4_dns_to_dbus,
ip4_dns_from_dbus);
/* ---dbus---
* property: addresses
@ -818,18 +817,19 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *ip4_class)
* for that subnet.
* ---end---
*/
_nm_setting_class_override_property (setting_class,
NM_SETTING_IP_CONFIG_ADDRESSES,
G_VARIANT_TYPE ("aau"),
ip4_addresses_get,
ip4_addresses_set,
NULL);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_IP_CONFIG_ADDRESSES),
G_VARIANT_TYPE ("aau"),
ip4_addresses_get,
ip4_addresses_set,
NULL);
_nm_setting_class_add_dbus_only_property (setting_class,
"address-labels",
G_VARIANT_TYPE_STRING_ARRAY,
ip4_address_labels_get,
NULL);
_properties_override_add_dbus_only (properties_override,
"address-labels",
G_VARIANT_TYPE_STRING_ARRAY,
ip4_address_labels_get,
NULL);
/* ---dbus---
* property: address-data
@ -840,11 +840,11 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *ip4_class)
* also exist on some addresses.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (setting_class,
"address-data",
G_VARIANT_TYPE ("aa{sv}"),
ip4_address_data_get,
ip4_address_data_set);
_properties_override_add_dbus_only (properties_override,
"address-data",
G_VARIANT_TYPE ("aa{sv}"),
ip4_address_data_get,
ip4_address_data_set);
/* ---dbus---
* property: routes
@ -863,12 +863,13 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *ip4_class)
* property.)
* ---end---
*/
_nm_setting_class_override_property (setting_class,
NM_SETTING_IP_CONFIG_ROUTES,
G_VARIANT_TYPE ("aau"),
ip4_routes_get,
ip4_routes_set,
NULL);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_IP_CONFIG_ROUTES),
G_VARIANT_TYPE ("aau"),
ip4_routes_get,
ip4_routes_set,
NULL);
/* ---dbus---
* property: route-data
@ -883,10 +884,12 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *ip4_class)
* also exist on some routes.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (setting_class,
"route-data",
G_VARIANT_TYPE ("aa{sv}"),
ip4_route_data_get,
ip4_route_data_set);
_properties_override_add_dbus_only (properties_override,
"route-data",
G_VARIANT_TYPE ("aa{sv}"),
ip4_route_data_get,
ip4_route_data_set);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_IP4_CONFIG,
NULL, properties_override);
}

View file

@ -52,8 +52,7 @@
* supported.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING_IP_CONFIG,
_nm_register_setting (IP6_CONFIG, NM_SETTING_PRIORITY_IP))
G_DEFINE_TYPE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING_IP_CONFIG)
#define NM_SETTING_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6ConfigPrivate))
@ -548,20 +547,19 @@ finalize (GObject *object)
}
static void
nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *ip6_class)
nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (ip6_class);
NMSettingClass *setting_class = NM_SETTING_CLASS (ip6_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array_ip_config ();
g_type_class_add_private (ip6_class, sizeof (NMSettingIP6ConfigPrivate));
g_type_class_add_private (klass, sizeof (NMSettingIP6ConfigPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
setting_class->verify = verify;
object_class->finalize = finalize;
/* Properties */
setting_class->verify = verify;
/* ---ifcfg-rh---
* property: method
@ -890,11 +888,12 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *ip6_class)
* description: Array of IP addresses of DNS servers (in network byte order)
* ---end---
*/
_nm_setting_class_transform_property (setting_class,
NM_SETTING_IP_CONFIG_DNS,
G_VARIANT_TYPE ("aay"),
ip6_dns_to_dbus,
ip6_dns_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_IP_CONFIG_DNS),
G_VARIANT_TYPE ("aay"),
ip6_dns_to_dbus,
ip6_dns_from_dbus);
/* ---dbus---
* property: addresses
@ -910,12 +909,13 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *ip6_class)
* that subnet.
* ---end---
*/
_nm_setting_class_override_property (setting_class,
NM_SETTING_IP_CONFIG_ADDRESSES,
G_VARIANT_TYPE ("a(ayuay)"),
ip6_addresses_get,
ip6_addresses_set,
NULL);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_IP_CONFIG_ADDRESSES),
G_VARIANT_TYPE ("a(ayuay)"),
ip6_addresses_get,
ip6_addresses_set,
NULL);
/* ---dbus---
* property: address-data
@ -926,11 +926,11 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *ip6_class)
* also exist on some addresses.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (setting_class,
"address-data",
G_VARIANT_TYPE ("aa{sv}"),
ip6_address_data_get,
ip6_address_data_set);
_properties_override_add_dbus_only (properties_override,
"address-data",
G_VARIANT_TYPE ("aa{sv}"),
ip6_address_data_get,
ip6_address_data_set);
/* ---dbus---
* property: routes
@ -946,12 +946,13 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *ip6_class)
* default metric for the device.
* ---end---
*/
_nm_setting_class_override_property (setting_class,
NM_SETTING_IP_CONFIG_ROUTES,
G_VARIANT_TYPE ("a(ayuayu)"),
ip6_routes_get,
ip6_routes_set,
NULL);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_IP_CONFIG_ROUTES),
G_VARIANT_TYPE ("a(ayuayu)"),
ip6_routes_get,
ip6_routes_set,
NULL);
/* ---dbus---
* property: route-data
@ -966,9 +967,12 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *ip6_class)
* also exist on some routes.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (setting_class,
"route-data",
G_VARIANT_TYPE ("aa{sv}"),
ip6_route_data_get,
ip6_route_data_set);
_properties_override_add_dbus_only (properties_override,
"route-data",
G_VARIANT_TYPE ("aa{sv}"),
ip6_route_data_get,
ip6_route_data_set);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_IP6_CONFIG,
NULL, properties_override);
}

View file

@ -40,8 +40,7 @@
* necessary for connection to MACsec (IEEE 802.1AE) interfaces.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingMacsec, nm_setting_macsec, NM_TYPE_SETTING,
_nm_register_setting (MACSEC, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingMacsec, nm_setting_macsec, NM_TYPE_SETTING)
#define NM_SETTING_MACSEC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_MACSEC, NMSettingMacsecPrivate))
@ -473,18 +472,19 @@ finalize (GObject *object)
}
static void
nm_setting_macsec_class_init (NMSettingMacsecClass *setting_class)
nm_setting_macsec_class_init (NMSettingMacsecClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingMacsecPrivate));
g_type_class_add_private (klass, sizeof (NMSettingMacsecPrivate));
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->need_secrets = need_secrets;
setting_class->verify = verify;
setting_class->need_secrets = need_secrets;
/**
* NMSettingMacsec:parent:
@ -626,4 +626,6 @@ nm_setting_macsec_class_init (NMSettingMacsecClass *setting_class)
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_MACSEC);
}

View file

@ -39,8 +39,7 @@
* necessary for connection to macvlan interfaces.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingMacvlan, nm_setting_macvlan, NM_TYPE_SETTING,
_nm_register_setting (MACVLAN, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingMacvlan, nm_setting_macvlan, NM_TYPE_SETTING)
#define NM_SETTING_MACVLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_MACVLAN, NMSettingMacvlanPrivate))
@ -259,20 +258,18 @@ finalize (GObject *object)
}
static void
nm_setting_macvlan_class_init (NMSettingMacvlanClass *setting_class)
nm_setting_macvlan_class_init (NMSettingMacvlanClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingMacvlanPrivate));
g_type_class_add_private (klass, sizeof (NMSettingMacvlanPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingMacvlan:parent:
@ -341,4 +338,6 @@ nm_setting_macvlan_class_init (NMSettingMacvlanClass *setting_class)
G_PARAM_CONSTRUCT |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_MACVLAN);
}

View file

@ -39,8 +39,7 @@
static void nm_setting_olpc_mesh_init (NMSettingOlpcMesh *setting);
G_DEFINE_TYPE_WITH_CODE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING,
_nm_register_setting (OLPC_MESH, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING)
#define NM_SETTING_OLPC_MESH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMeshPrivate))
@ -213,20 +212,20 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_olpc_mesh_class_init (NMSettingOlpcMeshClass *setting_class)
nm_setting_olpc_mesh_class_init (NMSettingOlpcMeshClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingOlpcMeshPrivate));
g_type_class_add_private (klass, sizeof (NMSettingOlpcMeshPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingOlpcMesh:ssid:
*
@ -267,8 +266,14 @@ nm_setting_olpc_mesh_class_init (NMSettingOlpcMeshClass *setting_class)
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_OLPC_MESH,
NULL, properties_override);
}

View file

@ -61,8 +61,7 @@ struct _NMSettingOvsBridgeClass {
NMSettingClass parent;
};
G_DEFINE_TYPE_WITH_CODE (NMSettingOvsBridge, nm_setting_ovs_bridge, NM_TYPE_SETTING,
_nm_register_setting (OVS_BRIDGE, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingOvsBridge, nm_setting_ovs_bridge, NM_TYPE_SETTING)
/*****************************************************************************/
@ -263,15 +262,16 @@ finalize (GObject *object)
}
static void
nm_setting_ovs_bridge_class_init (NMSettingOvsBridgeClass *setting_class)
nm_setting_ovs_bridge_class_init (NMSettingOvsBridgeClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
object_class->finalize = finalize;
setting_class->verify = verify;
/**
* NMSettingOvsBridge:fail-mode:
@ -333,4 +333,6 @@ nm_setting_ovs_bridge_class_init (NMSettingOvsBridgeClass *setting_class)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_OVS_BRIDGE);
}

View file

@ -54,8 +54,7 @@ struct _NMSettingOvsInterfaceClass {
NMSettingClass parent;
};
G_DEFINE_TYPE_WITH_CODE (NMSettingOvsInterface, nm_setting_ovs_interface, NM_TYPE_SETTING,
_nm_register_setting (OVS_INTERFACE, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingOvsInterface, nm_setting_ovs_interface, NM_TYPE_SETTING)
/*****************************************************************************/
@ -362,15 +361,16 @@ finalize (GObject *object)
}
static void
nm_setting_ovs_interface_class_init (NMSettingOvsInterfaceClass *setting_class)
nm_setting_ovs_interface_class_init (NMSettingOvsInterfaceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
object_class->finalize = finalize;
setting_class->verify = verify;
/**
* NMSettingOvsInterface:type:
@ -387,4 +387,6 @@ nm_setting_ovs_interface_class_init (NMSettingOvsInterfaceClass *setting_class)
G_PARAM_CONSTRUCT |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_OVS_INTERFACE);
}

View file

@ -55,8 +55,7 @@ struct _NMSettingOvsPatchClass {
NMSettingClass parent;
};
G_DEFINE_TYPE_WITH_CODE (NMSettingOvsPatch, nm_setting_ovs_patch, NM_TYPE_SETTING,
_nm_register_setting (OVS_PATCH, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingOvsPatch, nm_setting_ovs_patch, NM_TYPE_SETTING)
/*****************************************************************************/
@ -181,15 +180,16 @@ finalize (GObject *object)
}
static void
nm_setting_ovs_patch_class_init (NMSettingOvsPatchClass *setting_class)
nm_setting_ovs_patch_class_init (NMSettingOvsPatchClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
object_class->finalize = finalize;
setting_class->verify = verify;
/**
* NMSettingOvsPatch:peer:
@ -207,4 +207,6 @@ nm_setting_ovs_patch_class_init (NMSettingOvsPatchClass *setting_class)
G_PARAM_CONSTRUCT |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_OVS_PATCH);
}

View file

@ -65,8 +65,7 @@ struct _NMSettingOvsPortClass {
NMSettingClass parent;
};
G_DEFINE_TYPE_WITH_CODE (NMSettingOvsPort, nm_setting_ovs_port, NM_TYPE_SETTING,
_nm_register_setting (OVS_PORT, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingOvsPort, nm_setting_ovs_port, NM_TYPE_SETTING)
/*****************************************************************************/
@ -360,15 +359,16 @@ finalize (GObject *object)
}
static void
nm_setting_ovs_port_class_init (NMSettingOvsPortClass *setting_class)
nm_setting_ovs_port_class_init (NMSettingOvsPortClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
object_class->finalize = finalize;
setting_class->verify = verify;
/**
* NMSettingOvsPort:vlan-mode:
@ -466,4 +466,6 @@ nm_setting_ovs_port_class_init (NMSettingOvsPortClass *setting_class)
G_PARAM_CONSTRUCT |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_OVS_PORT);
}

View file

@ -35,8 +35,7 @@
* cable and DSL modems and some mobile broadband devices.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingPpp, nm_setting_ppp, NM_TYPE_SETTING,
_nm_register_setting (PPP, NM_SETTING_PRIORITY_AUX))
G_DEFINE_TYPE (NMSettingPpp, nm_setting_ppp, NM_TYPE_SETTING)
#define NM_SETTING_PPP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPP, NMSettingPppPrivate))
@ -524,19 +523,18 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_ppp_class_init (NMSettingPppClass *setting_class)
nm_setting_ppp_class_init (NMSettingPppClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingPppPrivate));
g_type_class_add_private (klass, sizeof (NMSettingPppPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingPpp:noauth:
*
@ -797,4 +795,6 @@ nm_setting_ppp_class_init (NMSettingPppClass *setting_class)
G_PARAM_CONSTRUCT |
NM_SETTING_PARAM_FUZZY_IGNORE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_PPP);
}

View file

@ -38,8 +38,7 @@
* to provide IP transport, for example cable or DSL modems.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingPppoe, nm_setting_pppoe, NM_TYPE_SETTING,
_nm_register_setting (PPPOE, NM_SETTING_PRIORITY_AUX))
G_DEFINE_TYPE (NMSettingPppoe, nm_setting_pppoe, NM_TYPE_SETTING)
#define NM_SETTING_PPPOE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPPOE, NMSettingPppoePrivate))
@ -287,21 +286,20 @@ finalize (GObject *object)
}
static void
nm_setting_pppoe_class_init (NMSettingPppoeClass *setting_class)
nm_setting_pppoe_class_init (NMSettingPppoeClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingPppoePrivate));
g_type_class_add_private (klass, sizeof (NMSettingPppoePrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->need_secrets = need_secrets;
/* Properties */
setting_class->verify = verify;
setting_class->need_secrets = need_secrets;
/**
* NMSettingPppoe:parent:
*
@ -373,4 +371,6 @@ nm_setting_pppoe_class_init (NMSettingPppoeClass *setting_class)
NM_SETTING_SECRET_FLAG_NONE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_PPPOE);
}

View file

@ -31,19 +31,14 @@
#include "nm-core-internal.h"
void _nm_register_setting_impl (const char *name,
GType type,
NMSettingPriority priority);
#define _nm_register_setting(name, priority) \
G_STMT_START { \
_nm_register_setting_impl ("" NM_SETTING_ ## name ## _SETTING_NAME "", g_define_type_id, priority); \
} G_STMT_END
/*****************************************************************************/
NMSettingPriority _nm_setting_get_base_type_priority (NMSetting *setting);
NMSettingPriority _nm_setting_type_get_base_type_priority (GType type);
int _nm_setting_compare_priority (gconstpointer a, gconstpointer b);
/*****************************************************************************/
typedef enum NMSettingUpdateSecretResult {
NM_SETTING_UPDATE_SECRET_ERROR = FALSE,
NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED = TRUE,
@ -85,6 +80,8 @@ gboolean _nm_setting_clear_secrets_with_flags (NMSetting *setting,
*/
#define NM_SETTING_PARAM_REAPPLY_IMMEDIATELY (1 << (6 + G_PARAM_USER_SHIFT))
#define NM_SETTING_PARAM_GENDATA_BACKED (1 << (7 + G_PARAM_USER_SHIFT))
GVariant *_nm_setting_get_deprecated_virtual_interface_name (NMSetting *setting,
NMConnection *connection,
const char *property);
@ -110,44 +107,78 @@ NMSetting *_nm_setting_new_from_dbus (GType setting_type,
NMSettingParseFlags parse_flags,
GError **error);
typedef GVariant * (*NMSettingPropertyGetFunc) (NMSetting *setting,
const char *property);
typedef GVariant * (*NMSettingPropertySynthFunc) (NMSetting *setting,
NMConnection *connection,
const char *property);
typedef gboolean (*NMSettingPropertySetFunc) (NMSetting *setting,
GVariant *connection_dict,
const char *property,
GVariant *value,
NMSettingParseFlags parse_flags,
GError **error);
typedef gboolean (*NMSettingPropertyNotSetFunc) (NMSetting *setting,
GVariant *connection_dict,
const char *property,
NMSettingParseFlags parse_flags,
GError **error);
/*****************************************************************************/
void _nm_setting_class_add_dbus_only_property (NMSettingClass *setting_class,
const char *property_name,
const GVariantType *dbus_type,
NMSettingPropertySynthFunc synth_func,
NMSettingPropertySetFunc set_func);
static inline GArray *
_nm_sett_info_property_override_create_array (void)
{
return g_array_new (FALSE, FALSE, sizeof (NMSettInfoProperty));
}
void _nm_setting_class_override_property (NMSettingClass *setting_class,
const char *property_name,
const GVariantType *dbus_type,
NMSettingPropertyGetFunc get_func,
NMSettingPropertySetFunc set_func,
NMSettingPropertyNotSetFunc not_set_func);
GArray *_nm_sett_info_property_override_create_array_ip_config (void);
typedef GVariant * (*NMSettingPropertyTransformToFunc) (const GValue *from);
typedef void (*NMSettingPropertyTransformFromFunc) (GVariant *from, GValue *to);
void _nm_setting_class_commit_full (NMSettingClass *setting_class,
NMMetaSettingType meta_type,
const NMSettInfoSettDetail *detail,
GArray *properties_override);
void _nm_setting_class_transform_property (NMSettingClass *setting_class,
const char *property_name,
const GVariantType *dbus_type,
NMSettingPropertyTransformToFunc to_dbus,
NMSettingPropertyTransformFromFunc from_dbus);
static inline void
_nm_setting_class_commit (NMSettingClass *setting_class,
NMMetaSettingType meta_type)
{
_nm_setting_class_commit_full (setting_class, meta_type, NULL, NULL);
}
#define NM_SETT_INFO_SETT_GENDATA(...) \
({ \
static const NMSettInfoSettGendata _g = { \
__VA_ARGS__ \
}; \
\
&_g; \
})
#define NM_SETT_INFO_SETT_DETAIL(...) \
(&((const NMSettInfoSettDetail) { \
__VA_ARGS__ \
}))
#define NM_SETT_INFO_PROPERTY(...) \
(&((const NMSettInfoProperty) { \
__VA_ARGS__ \
}))
void _properties_override_add_struct (GArray *properties_override,
const NMSettInfoProperty *prop_info);
void _properties_override_add__helper (GArray *properties_override,
NMSettInfoProperty *prop_info);
#define _properties_override_add(properties_override, \
...) \
(_properties_override_add_struct (properties_override, \
NM_SETT_INFO_PROPERTY (__VA_ARGS__)))
void _properties_override_add_dbus_only (GArray *properties_override,
const char *property_name,
const GVariantType *dbus_type,
NMSettingPropertySynthFunc synth_func,
NMSettingPropertySetFunc set_func);
void _properties_override_add_override (GArray *properties_override,
GParamSpec *param_spec,
const GVariantType *dbus_type,
NMSettingPropertyGetFunc get_func,
NMSettingPropertySetFunc set_func,
NMSettingPropertyNotSetFunc not_set_func);
void _properties_override_add_transform (GArray *properties_override,
GParamSpec *param_spec,
const GVariantType *dbus_type,
NMSettingPropertyTransformToFunc to_dbus,
NMSettingPropertyTransformFromFunc from_dbus);
/*****************************************************************************/
gboolean _nm_setting_use_legacy_property (NMSetting *setting,
GVariant *connection_dict,
@ -156,4 +187,6 @@ gboolean _nm_setting_use_legacy_property (NMSetting *setting,
GPtrArray *_nm_setting_need_secrets (NMSetting *setting);
/*****************************************************************************/
#endif /* NM_SETTING_PRIVATE_H */

View file

@ -39,8 +39,7 @@
* to fulfill client queries.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingProxy, nm_setting_proxy, NM_TYPE_SETTING,
_nm_register_setting (PROXY, NM_SETTING_PRIORITY_IP))
G_DEFINE_TYPE (NMSettingProxy, nm_setting_proxy, NM_TYPE_SETTING)
#define NM_SETTING_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PROXY, NMSettingProxyPrivate))
@ -284,18 +283,18 @@ set_property (GObject *object, guint prop_id,
}
static void
nm_setting_proxy_class_init (NMSettingProxyClass *setting_class)
nm_setting_proxy_class_init (NMSettingProxyClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingProxyPrivate));
g_type_class_add_private (klass, sizeof (NMSettingProxyPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
object_class->finalize = finalize;
setting_class->verify = verify;
/**
* NMSettingProxy:method:
@ -383,4 +382,6 @@ nm_setting_proxy_class_init (NMSettingProxyClass *setting_class)
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_PROXY);
}

View file

@ -37,8 +37,7 @@
* such as mobile broadband or analog telephone connections.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING,
_nm_register_setting (SERIAL, NM_SETTING_PRIORITY_HW_AUX))
G_DEFINE_TYPE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING)
#define NM_SETTING_SERIAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_SERIAL, NMSettingSerialPrivate))
@ -237,19 +236,17 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_serial_class_init (NMSettingSerialClass *setting_class)
nm_setting_serial_class_init (NMSettingSerialClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingSerialPrivate));
g_type_class_add_private (klass, sizeof (NMSettingSerialPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
/* Properties */
/**
* NMSettingSerial:baud:
*
@ -306,11 +303,13 @@ nm_setting_serial_class_init (NMSettingSerialClass *setting_class)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class,
NM_SETTING_SERIAL_PARITY,
G_VARIANT_TYPE_BYTE,
parity_to_dbus,
parity_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_SERIAL_PARITY),
G_VARIANT_TYPE_BYTE,
parity_to_dbus,
parity_from_dbus);
/**
* NMSettingSerial:stopbits:
@ -338,4 +337,7 @@ nm_setting_serial_class_init (NMSettingSerialClass *setting_class)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_SERIAL,
NULL, properties_override);
}

View file

@ -42,8 +42,7 @@ struct _NMSettingSriovClass {
NMSettingClass parent;
};
G_DEFINE_TYPE_WITH_CODE (NMSettingSriov, nm_setting_sriov, NM_TYPE_SETTING,
_nm_register_setting (SRIOV, NM_SETTING_PRIORITY_HW_AUX))
G_DEFINE_TYPE (NMSettingSriov, nm_setting_sriov, NM_TYPE_SETTING)
enum {
PROP_0,
@ -1197,7 +1196,7 @@ compare_property (NMSetting *setting,
{
NMSettingSriov *a = NM_SETTING_SRIOV (setting);
NMSettingSriov *b = NM_SETTING_SRIOV (other);
NMSettingClass *parent_class;
NMSettingClass *setting_class;
guint i;
if (nm_streq (prop_spec->name, NM_SETTING_SRIOV_VFS)) {
@ -1210,9 +1209,8 @@ compare_property (NMSetting *setting,
return TRUE;
}
/* Otherwise chain up to parent to handle generic compare */
parent_class = NM_SETTING_CLASS (nm_setting_sriov_parent_class);
return parent_class->compare_property (setting, other, prop_spec, flags);
setting_class = NM_SETTING_CLASS (nm_setting_sriov_parent_class);
return setting_class->compare_property (setting, other, prop_spec, flags);
}
static void
@ -1232,16 +1230,18 @@ finalize (GObject *object)
}
static void
nm_setting_sriov_class_init (NMSettingSriovClass *setting_class)
nm_setting_sriov_class_init (NMSettingSriovClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
object_class->finalize = finalize;
object_class->get_property = get_property;
object_class->set_property = set_property;
parent_class->compare_property = compare_property;
parent_class->verify = verify;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
/**
* NMSettingSriov:total-vfs
@ -1308,12 +1308,13 @@ nm_setting_sriov_class_init (NMSettingSriovClass *setting_class)
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (parent_class,
NM_SETTING_SRIOV_VFS,
G_VARIANT_TYPE ("aa{sv}"),
vfs_to_dbus,
vfs_from_dbus,
NULL);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_SRIOV_VFS),
G_VARIANT_TYPE ("aa{sv}"),
vfs_to_dbus,
vfs_from_dbus,
NULL);
/**
* NMSettingSriov:autoprobe-drivers
@ -1350,4 +1351,7 @@ nm_setting_sriov_class_init (NMSettingSriovClass *setting_class)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_SRIOV,
NULL, properties_override);
}

View file

@ -834,8 +834,7 @@ struct _NMSettingTCConfigClass {
NMSettingClass parent;
};
G_DEFINE_TYPE_WITH_CODE (NMSettingTCConfig, nm_setting_tc_config, NM_TYPE_SETTING,
_nm_register_setting (TC_CONFIG, NM_SETTING_PRIORITY_IP))
G_DEFINE_TYPE (NMSettingTCConfig, nm_setting_tc_config, NM_TYPE_SETTING)
/**
* nm_setting_tc_config_new:
@ -1242,7 +1241,7 @@ compare_property (NMSetting *setting,
{
NMSettingTCConfig *a_tc_config = NM_SETTING_TC_CONFIG (setting);
NMSettingTCConfig *b_tc_config = NM_SETTING_TC_CONFIG (other);
NMSettingClass *parent_class;
NMSettingClass *setting_class;
guint i;
if (nm_streq (prop_spec->name, NM_SETTING_TC_CONFIG_QDISCS)) {
@ -1265,9 +1264,8 @@ compare_property (NMSetting *setting,
return TRUE;
}
/* Otherwise chain up to parent to handle generic compare */
parent_class = NM_SETTING_CLASS (nm_setting_tc_config_parent_class);
return parent_class->compare_property (setting, other, prop_spec, flags);
setting_class = NM_SETTING_CLASS (nm_setting_tc_config_parent_class);
return setting_class->compare_property (setting, other, prop_spec, flags);
}
static void
@ -1589,19 +1587,18 @@ tc_tfilters_set (NMSetting *setting,
}
static void
nm_setting_tc_config_class_init (NMSettingTCConfigClass *setting_class)
nm_setting_tc_config_class_init (NMSettingTCConfigClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->compare_property = compare_property;
parent_class->verify = verify;
/* Properties */
setting_class->compare_property = compare_property;
setting_class->verify = verify;
/**
* NMSettingTCConfig:qdiscs: (type GPtrArray(NMTCQdisc))
@ -1623,12 +1620,13 @@ nm_setting_tc_config_class_init (NMSettingTCConfigClass *setting_class)
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (parent_class,
NM_SETTING_TC_CONFIG_QDISCS,
G_VARIANT_TYPE ("aa{sv}"),
tc_qdiscs_get,
tc_qdiscs_set,
NULL);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_TC_CONFIG_QDISCS),
G_VARIANT_TYPE ("aa{sv}"),
tc_qdiscs_get,
tc_qdiscs_set,
NULL);
/**
* NMSettingTCConfig:tfilters: (type GPtrArray(NMTCTfilter))
@ -1650,10 +1648,14 @@ nm_setting_tc_config_class_init (NMSettingTCConfigClass *setting_class)
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (parent_class,
NM_SETTING_TC_CONFIG_TFILTERS,
G_VARIANT_TYPE ("aa{sv}"),
tc_tfilters_get,
tc_tfilters_set,
NULL);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_TC_CONFIG_TFILTERS),
G_VARIANT_TYPE ("aa{sv}"),
tc_tfilters_get,
tc_tfilters_set,
NULL);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_TC_CONFIG,
NULL, properties_override);
}

View file

@ -39,8 +39,7 @@
* optional properties that apply to team ports.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingTeamPort, nm_setting_team_port, NM_TYPE_SETTING,
_nm_register_setting (TEAM_PORT, NM_SETTING_PRIORITY_AUX))
G_DEFINE_TYPE (NMSettingTeamPort, nm_setting_team_port, NM_TYPE_SETTING)
#define NM_SETTING_TEAM_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_TEAM_PORT, NMSettingTeamPortPrivate))
@ -408,7 +407,7 @@ compare_property (NMSetting *setting,
const GParamSpec *prop_spec,
NMSettingCompareFlags flags)
{
NMSettingClass *parent_class;
NMSettingClass *setting_class;
NMSettingTeamPortPrivate *a_priv, *b_priv;
guint i, j;
@ -442,9 +441,8 @@ compare_property (NMSetting *setting,
return TRUE;
}
/* Otherwise chain up to parent to handle generic compare */
parent_class = NM_SETTING_CLASS (nm_setting_team_port_parent_class);
return parent_class->compare_property (setting, other, prop_spec, flags);
setting_class = NM_SETTING_CLASS (nm_setting_team_port_parent_class);
return setting_class->compare_property (setting, other, prop_spec, flags);
}
static void
@ -587,21 +585,21 @@ finalize (GObject *object)
}
static void
nm_setting_team_port_class_init (NMSettingTeamPortClass *setting_class)
nm_setting_team_port_class_init (NMSettingTeamPortClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingTeamPortPrivate));
g_type_class_add_private (klass, sizeof (NMSettingTeamPortPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->compare_property = compare_property;
parent_class->verify = verify;
/* Properties */
setting_class->compare_property = compare_property;
setting_class->verify = verify;
/**
* NMSettingTeamPort:config:
*
@ -715,10 +713,14 @@ nm_setting_team_port_class_init (NMSettingTeamPortClass *setting_class)
G_TYPE_PTR_ARRAY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class,
NM_SETTING_TEAM_PORT_LINK_WATCHERS,
G_VARIANT_TYPE ("aa{sv}"),
team_link_watchers_to_dbus,
team_link_watchers_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_TEAM_PORT_LINK_WATCHERS),
G_VARIANT_TYPE ("aa{sv}"),
team_link_watchers_to_dbus,
team_link_watchers_from_dbus);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_TEAM_PORT,
NULL, properties_override);
}

View file

@ -557,8 +557,7 @@ nm_team_link_watcher_get_flags (NMTeamLinkWatcher *watcher)
/*****************************************************************************/
G_DEFINE_TYPE_WITH_CODE (NMSettingTeam, nm_setting_team, NM_TYPE_SETTING,
_nm_register_setting (TEAM, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingTeam, nm_setting_team, NM_TYPE_SETTING)
#define NM_SETTING_TEAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_TEAM, NMSettingTeamPrivate))
@ -1238,7 +1237,7 @@ compare_property (NMSetting *setting,
NMSettingCompareFlags flags)
{
NMSettingTeamPrivate *a_priv, *b_priv;
NMSettingClass *parent_class;
NMSettingClass *setting_class;
guint i, j;
/* If we are trying to match a connection in order to assume it (and thus
@ -1271,9 +1270,8 @@ compare_property (NMSetting *setting,
return TRUE;
}
/* Otherwise chain up to parent to handle generic compare */
parent_class = NM_SETTING_CLASS (nm_setting_team_parent_class);
return parent_class->compare_property (setting, other, prop_spec, flags);
setting_class = NM_SETTING_CLASS (nm_setting_team_parent_class);
return setting_class->compare_property (setting, other, prop_spec, flags);
}
static void
@ -1558,21 +1556,21 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_team_class_init (NMSettingTeamClass *setting_class)
nm_setting_team_class_init (NMSettingTeamClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingTeamPrivate));
g_type_class_add_private (klass, sizeof (NMSettingTeamPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->compare_property = compare_property;
parent_class->verify = verify;
/* Properties */
setting_class->compare_property = compare_property;
setting_class->verify = verify;
/**
* NMSettingTeam:config:
*
@ -1818,11 +1816,13 @@ nm_setting_team_class_init (NMSettingTeamClass *setting_class)
G_TYPE_PTR_ARRAY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class,
NM_SETTING_TEAM_LINK_WATCHERS,
G_VARIANT_TYPE ("aa{sv}"),
team_link_watchers_to_dbus,
team_link_watchers_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_TEAM_LINK_WATCHERS),
G_VARIANT_TYPE ("aa{sv}"),
team_link_watchers_to_dbus,
team_link_watchers_from_dbus);
/* ---dbus---
* property: interface-name
@ -1832,8 +1832,12 @@ nm_setting_team_class_init (NMSettingTeamClass *setting_class)
* team's interface name.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (parent_class, "interface-name",
G_VARIANT_TYPE_STRING,
_nm_setting_get_deprecated_virtual_interface_name,
NULL);
_properties_override_add_dbus_only (properties_override,
"interface-name",
G_VARIANT_TYPE_STRING,
_nm_setting_get_deprecated_virtual_interface_name,
NULL);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_TEAM,
NULL, properties_override);
}

View file

@ -38,8 +38,7 @@
* necessary for connection to TUN/TAP interfaces.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingTun, nm_setting_tun, NM_TYPE_SETTING,
_nm_register_setting (TUN, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingTun, nm_setting_tun, NM_TYPE_SETTING)
#define NM_SETTING_TUN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_TUN, NMSettingTunPrivate))
@ -291,20 +290,19 @@ finalize (GObject *object)
}
static void
nm_setting_tun_class_init (NMSettingTunClass *setting_class)
nm_setting_tun_class_init (NMSettingTunClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingTunPrivate));
g_type_class_add_private (klass, sizeof (NMSettingTunPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingTun:mode:
*
@ -405,4 +403,6 @@ nm_setting_tun_class_init (NMSettingTunClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_TUN);
}

View file

@ -63,8 +63,7 @@ struct _NMSettingUserClass {
NMSettingClass parent;
};
G_DEFINE_TYPE_WITH_CODE (NMSettingUser, nm_setting_user, NM_TYPE_SETTING,
_nm_register_setting (USER, NM_SETTING_PRIORITY_USER))
G_DEFINE_TYPE (NMSettingUser, nm_setting_user, NM_TYPE_SETTING)
#define NM_SETTING_USER_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMSettingUser, NM_IS_SETTING_USER)
@ -396,29 +395,6 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
return TRUE;
}
static gboolean
hash_table_equal (GHashTable *a, GHashTable *b)
{
guint n;
GHashTableIter iter;
const char *key, *value, *valu2;
n = a ? g_hash_table_size (a) : 0;
if (n != (b ? g_hash_table_size (b) : 0))
return FALSE;
if (n > 0) {
g_hash_table_iter_init (&iter, a);
while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value)) {
if (!g_hash_table_lookup_extended (b, key, NULL, (gpointer *) &valu2))
return FALSE;
if (!nm_streq (value, valu2))
return FALSE;
}
}
return TRUE;
}
static gboolean
compare_property (NMSetting *setting,
NMSetting *other,
@ -436,10 +412,10 @@ compare_property (NMSetting *setting,
priv = NM_SETTING_USER_GET_PRIVATE (NM_SETTING_USER (setting));
pri2 = NM_SETTING_USER_GET_PRIVATE (NM_SETTING_USER (other));
if (!hash_table_equal (priv->data, pri2->data))
if (!nm_utils_hash_table_equal (priv->data, pri2->data, TRUE, g_str_equal))
return FALSE;
if (!hash_table_equal (priv->data_invalid, pri2->data_invalid))
if (!nm_utils_hash_table_equal (priv->data_invalid, pri2->data_invalid, TRUE, g_str_equal))
return FALSE;
return TRUE;
@ -571,12 +547,14 @@ nm_setting_user_class_init (NMSettingUserClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
setting_class->compare_property = compare_property;
setting_class->verify = verify;
setting_class->verify = verify;
/**
* NMSettingUser:data: (type GHashTable(utf8,utf8))
@ -607,8 +585,13 @@ nm_setting_user_class_init (NMSettingUserClass *klass)
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
_nm_setting_class_transform_property (setting_class, NM_SETTING_USER_DATA,
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_USER_DATA),
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_USER,
NULL, properties_override);
}

View file

@ -41,8 +41,7 @@
* necessary for connection to VLAN interfaces.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING,
_nm_register_setting (VLAN, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING)
#define NM_SETTING_VLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VLAN, NMSettingVlanPrivate))
@ -830,20 +829,19 @@ finalize (GObject *object)
}
static void
nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
nm_setting_vlan_class_init (NMSettingVlanClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingVlanPrivate));
g_type_class_add_private (klass, sizeof (NMSettingVlanPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingVlan:parent:
@ -920,11 +918,14 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
G_PARAM_CONSTRUCT |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (parent_class, NM_SETTING_VLAN_FLAGS,
NULL,
_override_flags_get,
NULL,
_override_flags_not_set);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_VLAN_FLAGS),
NULL,
_override_flags_get,
NULL,
_override_flags_not_set);
/**
* NMSettingVlan:ingress-priority-map:
@ -986,8 +987,12 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
* vlan's interface name.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (parent_class, "interface-name",
G_VARIANT_TYPE_STRING,
_nm_setting_get_deprecated_virtual_interface_name,
NULL);
_properties_override_add_dbus_only (properties_override,
"interface-name",
G_VARIANT_TYPE_STRING,
_nm_setting_get_deprecated_virtual_interface_name,
NULL);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_VLAN,
NULL, properties_override);
}

View file

@ -43,8 +43,7 @@
* properties.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingVpn, nm_setting_vpn, NM_TYPE_SETTING,
_nm_register_setting (VPN, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingVpn, nm_setting_vpn, NM_TYPE_SETTING)
#define NM_SETTING_VPN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VPN, NMSettingVpnPrivate))
@ -888,27 +887,26 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_vpn_class_init (NMSettingVpnClass *setting_class)
nm_setting_vpn_class_init (NMSettingVpnClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingVpnPrivate));
g_type_class_add_private (klass, sizeof (NMSettingVpnPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->update_one_secret = update_one_secret;
parent_class->get_secret_flags = get_secret_flags;
parent_class->set_secret_flags = set_secret_flags;
parent_class->need_secrets = need_secrets;
parent_class->compare_property = compare_property;
parent_class->clear_secrets_with_flags = clear_secrets_with_flags;
setting_class->verify = verify;
setting_class->update_one_secret = update_one_secret;
setting_class->get_secret_flags = get_secret_flags;
setting_class->set_secret_flags = set_secret_flags;
setting_class->need_secrets = need_secrets;
setting_class->compare_property = compare_property;
setting_class->clear_secrets_with_flags = clear_secrets_with_flags;
/* Properties */
/**
* NMSettingVpn:service-type:
*
@ -974,10 +972,13 @@ nm_setting_vpn_class_init (NMSettingVpnClass *setting_class)
G_TYPE_HASH_TABLE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_VPN_DATA,
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_VPN_DATA),
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
/**
* NMSettingVpn:secrets: (type GHashTable(utf8,utf8)):
@ -1000,10 +1001,13 @@ nm_setting_vpn_class_init (NMSettingVpnClass *setting_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_SECRET |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_VPN_SECRETS,
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_VPN_SECRETS),
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
/**
* NMSettingVpn:timeout:
@ -1022,4 +1026,7 @@ nm_setting_vpn_class_init (NMSettingVpnClass *setting_class)
0, G_MAXUINT32, 0,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_VPN,
NULL, properties_override);
}

View file

@ -36,8 +36,7 @@
* necessary for connection to VXLAN interfaces.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingVxlan, nm_setting_vxlan, NM_TYPE_SETTING,
_nm_register_setting (VXLAN, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingVxlan, nm_setting_vxlan, NM_TYPE_SETTING)
#define NM_SETTING_VXLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VXLAN, NMSettingVxlanPrivate))
@ -564,20 +563,18 @@ finalize (GObject *object)
}
static void
nm_setting_vxlan_class_init (NMSettingVxlanClass *setting_class)
nm_setting_vxlan_class_init (NMSettingVxlanClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingVxlanPrivate));
g_type_class_add_private (klass, sizeof (NMSettingVxlanPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingVxlan:parent:
@ -839,4 +836,6 @@ nm_setting_vxlan_class_init (NMSettingVxlanClass *setting_class)
G_PARAM_CONSTRUCT |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_VXLAN);
}

View file

@ -42,8 +42,7 @@
* connections cannot be activated.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING,
_nm_register_setting (WIMAX, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING)
#define NM_SETTING_WIMAX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIMAX, NMSettingWimaxPrivate))
@ -206,20 +205,20 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_wimax_class_init (NMSettingWimaxClass *setting_class)
nm_setting_wimax_class_init (NMSettingWimaxClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingWimaxPrivate));
g_type_class_add_private (klass, sizeof (NMSettingWimaxPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
/* Properties */
setting_class->verify = verify;
/**
* NMSettingWimax:network-name:
*
@ -250,8 +249,14 @@ nm_setting_wimax_class_init (NMSettingWimaxClass *setting_class)
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class, NM_SETTING_WIMAX_MAC_ADDRESS,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIMAX_MAC_ADDRESS),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_WIMAX,
NULL, properties_override);
}

View file

@ -40,8 +40,7 @@
* necessary for connection to Ethernet networks.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING,
_nm_register_setting (WIRED, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING)
#define NM_SETTING_WIRED_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRED, NMSettingWiredPrivate))
@ -782,15 +781,15 @@ compare_property (NMSetting *setting,
const GParamSpec *prop_spec,
NMSettingCompareFlags flags)
{
NMSettingClass *parent_class;
NMSettingClass *setting_class;
if (nm_streq (prop_spec->name, NM_SETTING_WIRED_CLONED_MAC_ADDRESS)) {
return nm_streq0 (NM_SETTING_WIRED_GET_PRIVATE (setting)->cloned_mac_address,
NM_SETTING_WIRED_GET_PRIVATE (other)->cloned_mac_address);
}
parent_class = NM_SETTING_CLASS (nm_setting_wired_parent_class);
return parent_class->compare_property (setting, other, prop_spec, flags);
setting_class = NM_SETTING_CLASS (nm_setting_wired_parent_class);
return setting_class->compare_property (setting, other, prop_spec, flags);
}
static GVariant *
@ -977,21 +976,21 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_wired_class_init (NMSettingWiredClass *setting_wired_class)
nm_setting_wired_class_init (NMSettingWiredClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_wired_class);
NMSettingClass *setting_class = NM_SETTING_CLASS (setting_wired_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_wired_class, sizeof (NMSettingWiredPrivate));
g_type_class_add_private (klass, sizeof (NMSettingWiredPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
setting_class->verify = verify;
setting_class->verify = verify;
setting_class->compare_property = compare_property;
/* Properties */
/**
* NMSettingWired:port:
*
@ -1102,12 +1101,14 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_wired_class)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (setting_class,
NM_SETTING_WIRED_AUTO_NEGOTIATE,
G_VARIANT_TYPE_BOOLEAN,
_override_autoneg_get,
NULL,
NULL);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIRED_AUTO_NEGOTIATE),
G_VARIANT_TYPE_BOOLEAN,
_override_autoneg_get,
NULL,
NULL);
/**
* NMSettingWired:mac-address:
@ -1140,10 +1141,13 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_wired_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (setting_class, NM_SETTING_WIRED_MAC_ADDRESS,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIRED_MAC_ADDRESS),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
/**
* NMSettingWired:cloned-mac-address:
@ -1195,8 +1199,10 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_wired_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (setting_class,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIRED_CLONED_MAC_ADDRESS),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_cloned_get,
_nm_utils_hwaddr_cloned_set,
@ -1214,11 +1220,11 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_wired_class)
* "cloned-mac-address".
* ---end---
*/
_nm_setting_class_add_dbus_only_property (setting_class,
"assigned-mac-address",
G_VARIANT_TYPE_STRING,
_nm_utils_hwaddr_cloned_data_synth,
_nm_utils_hwaddr_cloned_data_set);
_properties_override_add_dbus_only (properties_override,
"assigned-mac-address",
G_VARIANT_TYPE_STRING,
_nm_utils_hwaddr_cloned_data_synth,
_nm_utils_hwaddr_cloned_data_set);
/**
* NMSettingWired:generate-mac-address-mask:
@ -1388,10 +1394,13 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_wired_class)
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (setting_class, NM_SETTING_WIRED_S390_OPTIONS,
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIRED_S390_OPTIONS),
G_VARIANT_TYPE ("a{ss}"),
_nm_utils_strdict_to_dbus,
_nm_utils_strdict_from_dbus);
/**
* NMSettingWired:wake-on-lan:
@ -1430,4 +1439,7 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_wired_class)
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_WIRED,
NULL, properties_override);
}

View file

@ -53,8 +53,7 @@
* ISBN: 978-1587051548
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING,
_nm_register_setting (WIRELESS_SECURITY, NM_SETTING_PRIORITY_HW_AUX))
G_DEFINE_TYPE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING)
#define NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS_SECURITY, NMSettingWirelessSecurityPrivate))
@ -1430,25 +1429,24 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_wireless_security_class_init (NMSettingWirelessSecurityClass *setting_class)
nm_setting_wireless_security_class_init (NMSettingWirelessSecurityClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_class, sizeof (NMSettingWirelessSecurityPrivate));
g_type_class_add_private (klass, sizeof (NMSettingWirelessSecurityPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
parent_class->verify_secrets = verify_secrets;
parent_class->need_secrets = need_secrets;
parent_class->get_secret_flags = get_secret_flags;
parent_class->set_secret_flags = set_secret_flags;
setting_class->verify = verify;
setting_class->verify_secrets = verify_secrets;
setting_class->need_secrets = need_secrets;
setting_class->get_secret_flags = get_secret_flags;
setting_class->set_secret_flags = set_secret_flags;
/* Properties */
/**
* NMSettingWirelessSecurity:key-mgmt:
*
@ -1855,11 +1853,13 @@ nm_setting_wireless_security_class_init (NMSettingWirelessSecurityClass *setting
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (parent_class,
NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE,
G_VARIANT_TYPE_UINT32,
wep_key_type_to_dbus,
NULL);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE),
G_VARIANT_TYPE_UINT32,
wep_key_type_to_dbus,
NULL);
/**
* NMSettingWirelessSecurity:wps-method:
*
@ -1921,4 +1921,7 @@ nm_setting_wireless_security_class_init (NMSettingWirelessSecurityClass *setting
G_PARAM_CONSTRUCT |
NM_SETTING_PARAM_FUZZY_IGNORE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_WIRELESS_SECURITY,
NULL, properties_override);
}

View file

@ -40,8 +40,7 @@
* necessary for connection to 802.11 Wi-Fi networks.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING,
_nm_register_setting (WIRELESS, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING)
#define NM_SETTING_WIRELESS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS, NMSettingWirelessPrivate))
@ -936,15 +935,15 @@ compare_property (NMSetting *setting,
const GParamSpec *prop_spec,
NMSettingCompareFlags flags)
{
NMSettingClass *parent_class;
NMSettingClass *setting_class;
if (nm_streq (prop_spec->name, NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS)) {
return nm_streq0 (NM_SETTING_WIRELESS_GET_PRIVATE (setting)->cloned_mac_address,
NM_SETTING_WIRELESS_GET_PRIVATE (other)->cloned_mac_address);
}
parent_class = NM_SETTING_CLASS (nm_setting_wireless_parent_class);
return parent_class->compare_property (setting, other, prop_spec, flags);
setting_class = NM_SETTING_CLASS (nm_setting_wireless_parent_class);
return setting_class->compare_property (setting, other, prop_spec, flags);
}
/*****************************************************************************/
@ -1175,21 +1174,21 @@ get_property (GObject *object, guint prop_id,
}
static void
nm_setting_wireless_class_init (NMSettingWirelessClass *setting_wireless_class)
nm_setting_wireless_class_init (NMSettingWirelessClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_wireless_class);
NMSettingClass *setting_class = NM_SETTING_CLASS (setting_wireless_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
GArray *properties_override = _nm_sett_info_property_override_create_array ();
g_type_class_add_private (setting_wireless_class, sizeof (NMSettingWirelessPrivate));
g_type_class_add_private (klass, sizeof (NMSettingWirelessPrivate));
/* virtual methods */
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
setting_class->verify = verify;
setting_class->verify = verify;
setting_class->compare_property = compare_property;
/* Properties */
/**
* NMSettingWireless:ssid:
*
@ -1307,10 +1306,13 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *setting_wireless_class)
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (setting_class, NM_SETTING_WIRELESS_BSSID,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIRELESS_BSSID),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
/**
* NMSettingWireless:rate:
@ -1387,10 +1389,13 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *setting_wireless_class)
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_transform_property (setting_class, NM_SETTING_WIRELESS_MAC_ADDRESS,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
_properties_override_add_transform (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIRELESS_MAC_ADDRESS),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_to_dbus,
_nm_utils_hwaddr_from_dbus);
/**
* NMSettingWireless:cloned-mac-address:
@ -1440,12 +1445,14 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *setting_wireless_class)
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_override_property (setting_class,
NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS,
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_cloned_get,
_nm_utils_hwaddr_cloned_set,
_nm_utils_hwaddr_cloned_not_set);
_properties_override_add_override (properties_override,
g_object_class_find_property (G_OBJECT_CLASS (setting_class),
NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS),
G_VARIANT_TYPE_BYTESTRING,
_nm_utils_hwaddr_cloned_get,
_nm_utils_hwaddr_cloned_set,
_nm_utils_hwaddr_cloned_not_set);
/* ---dbus---
* property: assigned-mac-address
@ -1459,11 +1466,11 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *setting_wireless_class)
* "cloned-mac-address".
* ---end---
*/
_nm_setting_class_add_dbus_only_property (setting_class,
"assigned-mac-address",
G_VARIANT_TYPE_STRING,
_nm_utils_hwaddr_cloned_data_synth,
_nm_utils_hwaddr_cloned_data_set);
_properties_override_add_dbus_only (properties_override,
"assigned-mac-address",
G_VARIANT_TYPE_STRING,
_nm_utils_hwaddr_cloned_data_synth,
_nm_utils_hwaddr_cloned_data_set);
/**
* NMSettingWireless:generate-mac-address-mask:
@ -1678,9 +1685,11 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *setting_wireless_class)
* NetworkManager daemons.
* ---end---
*/
_nm_setting_class_add_dbus_only_property (setting_class, "security",
G_VARIANT_TYPE_STRING,
nm_setting_wireless_get_security, NULL);
_properties_override_add_dbus_only (properties_override,
"security",
G_VARIANT_TYPE_STRING,
nm_setting_wireless_get_security,
NULL);
/**
* NMSettingWireless:wake-on-wlan:
@ -1707,4 +1716,7 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *setting_wireless_class)
G_PARAM_CONSTRUCT |
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_WIRELESS,
NULL, properties_override);
}

View file

@ -65,8 +65,7 @@ struct _NMSettingWpanClass {
* necessary for configuring IEEE 802.15.4 (WPAN) MAC layer devices.
**/
G_DEFINE_TYPE_WITH_CODE (NMSettingWpan, nm_setting_wpan, NM_TYPE_SETTING,
_nm_register_setting (WPAN, NM_SETTING_PRIORITY_HW_BASE))
G_DEFINE_TYPE (NMSettingWpan, nm_setting_wpan, NM_TYPE_SETTING)
#define NM_SETTING_WPAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WPAN, NMSettingWpanPrivate))
@ -214,17 +213,18 @@ finalize (GObject *object)
}
static void
nm_setting_wpan_class_init (NMSettingWpanClass *setting_wpan_class)
nm_setting_wpan_class_init (NMSettingWpanClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (setting_wpan_class);
NMSettingClass *setting_class = NM_SETTING_CLASS (setting_wpan_class);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
g_type_class_add_private (setting_class, sizeof (NMSettingWpanPrivate));
object_class->set_property = set_property;
object_class->get_property = get_property;
object_class->finalize = finalize;
setting_class->verify = verify;
object_class->finalize = finalize;
setting_class->verify = verify;
/**
* NMSettingWpan:mac-address:
@ -269,4 +269,6 @@ nm_setting_wpan_class_init (NMSettingWpanClass *setting_wpan_class)
0, G_MAXUINT16, G_MAXUINT16,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_WPAN);
}

File diff suppressed because it is too large Load diff

View file

@ -168,6 +168,8 @@ typedef gboolean (*NMSettingClearSecretsWithFlagsFn) (NMSetting *setting,
NMSettingSecretFlags flags,
gpointer user_data);
struct _NMMetaSettingInfo;
typedef struct {
GObjectClass parent;
@ -211,7 +213,10 @@ typedef struct {
NMSettingCompareFlags flags);
/*< private >*/
gpointer padding[7];
const struct _NMMetaSettingInfo *setting_info;
/*< private >*/
gpointer padding[6];
} NMSettingClass;
/**
@ -282,7 +287,8 @@ void nm_setting_enumerate_values (NMSetting *setting,
char *nm_setting_to_string (NMSetting *setting);
/* Secrets */
/*****************************************************************************/
gboolean nm_setting_get_secret_flags (NMSetting *setting,
const char *secret_name,
NMSettingSecretFlags *out_flags,
@ -293,10 +299,13 @@ gboolean nm_setting_set_secret_flags (NMSetting *setting,
NMSettingSecretFlags flags,
GError **error);
/* Properties */
/*****************************************************************************/
const GVariantType *nm_setting_get_dbus_property_type (NMSetting *setting,
const char *property_name);
/*****************************************************************************/
G_END_DECLS
#endif /* __NM_SETTING_H__ */

View file

@ -647,119 +647,6 @@ _nm_utils_ptrarray_find_first (gconstpointer *list, gssize len, gconstpointer ne
return -1;
}
gssize
_nm_utils_ptrarray_find_binary_search (gconstpointer *list,
gsize len,
gconstpointer needle,
GCompareDataFunc cmpfcn,
gpointer user_data,
gssize *out_idx_first,
gssize *out_idx_last)
{
gssize imin, imax, imid, i2min, i2max, i2mid;
int cmp;
g_return_val_if_fail (list || !len, ~((gssize) 0));
g_return_val_if_fail (cmpfcn, ~((gssize) 0));
imin = 0;
if (len > 0) {
imax = len - 1;
while (imin <= imax) {
imid = imin + (imax - imin) / 2;
cmp = cmpfcn (list[imid], needle, user_data);
if (cmp == 0) {
/* we found a matching entry at index imid.
*
* Does the caller request the first/last index as well (in case that
* there are multiple entries which compare equal). */
if (out_idx_first) {
i2min = imin;
i2max = imid + 1;
while (i2min <= i2max) {
i2mid = i2min + (i2max - i2min) / 2;
cmp = cmpfcn (list[i2mid], needle, user_data);
if (cmp == 0)
i2max = i2mid -1;
else {
nm_assert (cmp < 0);
i2min = i2mid + 1;
}
}
*out_idx_first = i2min;
}
if (out_idx_last) {
i2min = imid + 1;
i2max = imax;
while (i2min <= i2max) {
i2mid = i2min + (i2max - i2min) / 2;
cmp = cmpfcn (list[i2mid], needle, user_data);
if (cmp == 0)
i2min = i2mid + 1;
else {
nm_assert (cmp > 0);
i2max = i2mid - 1;
}
}
*out_idx_last = i2min - 1;
}
return imid;
}
if (cmp < 0)
imin = imid + 1;
else
imax = imid - 1;
}
}
/* return the inverse of @imin. This is a negative number, but
* also is ~imin the position where the value should be inserted. */
imin = ~imin;
NM_SET_OUT (out_idx_first, imin);
NM_SET_OUT (out_idx_last, imin);
return imin;
}
gssize
_nm_utils_array_find_binary_search (gconstpointer list, gsize elem_size, gsize len, gconstpointer needle, GCompareDataFunc cmpfcn, gpointer user_data)
{
gssize imin, imax, imid;
int cmp;
g_return_val_if_fail (list || !len, ~((gssize) 0));
g_return_val_if_fail (cmpfcn, ~((gssize) 0));
g_return_val_if_fail (elem_size > 0, ~((gssize) 0));
imin = 0;
if (len == 0)
return ~imin;
imax = len - 1;
while (imin <= imax) {
imid = imin + (imax - imin) / 2;
cmp = cmpfcn (&((const char *) list)[elem_size * imid], needle, user_data);
if (cmp == 0)
return imid;
if (cmp < 0)
imin = imid + 1;
else
imax = imid - 1;
}
/* return the inverse of @imin. This is a negative number, but
* also is ~imin the position where the value should be inserted. */
return ~imin;
}
GVariant *
_nm_utils_bytes_to_dbus (const GValue *prop_value)
{

View file

@ -43,6 +43,7 @@
#include "nm-setting-bridge-port.h"
#include "nm-setting-cdma.h"
#include "nm-setting-connection.h"
#include "nm-setting-ethtool.h"
#include "nm-setting-generic.h"
#include "nm-setting-gsm.h"
#include "nm-setting-infiniband.h"
@ -65,6 +66,7 @@
#include "nm-simple-connection.h"
#include "nm-keyfile-internal.h"
#include "nm-utils/nm-dedup-multi.h"
#include "nm-ethtool-utils.h"
#include "test-general-enums.h"
@ -6126,7 +6128,7 @@ _test_find_binary_search_do (const int *array, gsize len)
expected_result = _nm_utils_ptrarray_find_first (parray, len, pneedle);
idx = _nm_utils_ptrarray_find_binary_search (parray, len, pneedle, _test_find_binary_search_cmp, NULL, &idx_first, &idx_last);
idx = nm_utils_ptrarray_find_binary_search (parray, len, pneedle, _test_find_binary_search_cmp, NULL, &idx_first, &idx_last);
if (expected_result >= 0) {
g_assert_cmpint (expected_result, ==, idx);
} else {
@ -6188,12 +6190,12 @@ _test_find_binary_search_do_uint32 (const int *int_array, gsize len)
expected_result = idx;
}
idx = _nm_utils_array_find_binary_search (array,
sizeof (guint32),
len,
&NEEDLE,
nm_cmp_uint32_p_with_data,
NULL);
idx = nm_utils_array_find_binary_search (array,
sizeof (guint32),
len,
&NEEDLE,
nm_cmp_uint32_p_with_data,
NULL);
if (expected_result >= 0)
g_assert_cmpint (expected_result, ==, idx);
else {
@ -6293,11 +6295,11 @@ test_nm_utils_ptrarray_find_binary_search_with_duplicates (void)
for (i = 0; i < i_len + BIN_SEARCH_W_DUPS_JITTER; i++) {
gconstpointer p = GINT_TO_POINTER (i);
idx = _nm_utils_ptrarray_find_binary_search (arr, i_len, p, _test_bin_search2_cmp, NULL, &idx_first, &idx_last);
idx = nm_utils_ptrarray_find_binary_search (arr, i_len, p, _test_bin_search2_cmp, NULL, &idx_first, &idx_last);
idx_first2 = _nm_utils_ptrarray_find_first (arr, i_len, p);
idx2 = _nm_utils_array_find_binary_search (arr, sizeof (gpointer), i_len, &p, _test_bin_search2_cmp_p, NULL);
idx2 = nm_utils_array_find_binary_search (arr, sizeof (gpointer), i_len, &p, _test_bin_search2_cmp_p, NULL);
g_assert_cmpint (idx, ==, idx2);
if (idx_first2 < 0) {
@ -7058,6 +7060,22 @@ test_nm_va_args_macros (void)
/*****************************************************************************/
static void
test_ethtool_offload (void)
{
const NMEthtoolData *d;
g_assert_cmpint (nm_ethtool_id_get_by_name ("invalid"), ==, NM_ETHTOOL_ID_UNKNOWN);
g_assert_cmpint (nm_ethtool_id_get_by_name ("feature-rx"), ==, NM_ETHTOOL_ID_FEATURE_RX);
d = nm_ethtool_data_get_by_optname (NM_ETHTOOL_OPTNAME_FEATURE_RXHASH);
g_assert (d);
g_assert_cmpint (d->id, ==, NM_ETHTOOL_ID_FEATURE_RXHASH);
g_assert_cmpstr (d->optname, ==, NM_ETHTOOL_OPTNAME_FEATURE_RXHASH);
}
/*****************************************************************************/
NMTST_DEFINE ();
int main (int argc, char **argv)
@ -7197,8 +7215,8 @@ int main (int argc, char **argv)
g_test_add_func ("/core/general/_nm_utils_ascii_str_to_int64", test_nm_utils_ascii_str_to_int64);
g_test_add_func ("/core/general/nm_utils_is_power_of_two", test_nm_utils_is_power_of_two);
g_test_add_func ("/core/general/_nm_utils_ptrarray_find_binary_search", test_nm_utils_ptrarray_find_binary_search);
g_test_add_func ("/core/general/_nm_utils_ptrarray_find_binary_search_with_duplicates", test_nm_utils_ptrarray_find_binary_search_with_duplicates);
g_test_add_func ("/core/general/nm_utils_ptrarray_find_binary_search", test_nm_utils_ptrarray_find_binary_search);
g_test_add_func ("/core/general/nm_utils_ptrarray_find_binary_search_with_duplicates", test_nm_utils_ptrarray_find_binary_search_with_duplicates);
g_test_add_func ("/core/general/_nm_utils_strstrdictkey", test_nm_utils_strstrdictkey);
g_test_add_func ("/core/general/nm_ptrarray_len", test_nm_ptrarray_len);
@ -7212,8 +7230,8 @@ int main (int argc, char **argv)
g_test_add_func ("/core/general/route_attributes/format", test_route_attributes_format);
g_test_add_func ("/core/general/get_start_time_for_pid", test_get_start_time_for_pid);
g_test_add_func ("/core/general/test_nm_va_args_macros", test_nm_va_args_macros);
g_test_add_func ("/core/general/test_ethtool_offload", test_ethtool_offload);
return g_test_run ();
}

View file

@ -28,6 +28,7 @@
#include "nm-setting-8021x.h"
#include "nm-setting-bond.h"
#include "nm-setting-dcb.h"
#include "nm-setting-ethtool.h"
#include "nm-setting-team.h"
#include "nm-setting-team-port.h"
#include "nm-setting-tc-config.h"
@ -36,6 +37,7 @@
#include "nm-simple-connection.h"
#include "nm-setting-connection.h"
#include "nm-errors.h"
#include "nm-keyfile-internal.h"
#include "nm-utils/nm-test-utils.h"
@ -1264,6 +1266,79 @@ test_team_port_full_config (void)
/*****************************************************************************/
static void
test_ethtool_1 (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;
con = nmtst_create_minimal_connection ("ethtool-1",
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_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);
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);
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_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);
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,
"ethtool-keyfile-name",
NULL,
NULL,
NULL,
&error);
nmtst_assert_success (con3, error);
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_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);
}
/*****************************************************************************/
static void
test_sriov_vf (void)
{
@ -1899,6 +1974,8 @@ main (int argc, char **argv)
g_test_add_func ("/libnm/settings/dcb/priorities", test_dcb_priorities_valid);
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/sriov/vf", test_sriov_vf);
g_test_add_func ("/libnm/settings/sriov/vf-dup", test_sriov_vf_dup);
g_test_add_func ("/libnm/settings/sriov/vf-vlan", test_sriov_vf_vlan);

View file

@ -912,7 +912,6 @@ compare_property (NMSetting *setting,
&& g_strcmp0 (prop_spec->name, NM_SETTING_CONNECTION_ID) == 0)
return TRUE;
/* Otherwise chain up to parent to handle generic compare */
return NM_SETTING_CLASS (nm_setting_connection_parent_class)->compare_property (setting, other, prop_spec, flags);
}

View file

@ -72,6 +72,7 @@
#include "nm-setting-connection.h"
#include "nm-setting-dcb.h"
#include "nm-setting-dummy.h"
#include "nm-setting-ethtool.h"
#include "nm-setting-generic.h"
#include "nm-setting-gsm.h"
#include "nm-setting-infiniband.h"

View file

@ -1394,6 +1394,11 @@ global:
nm_device_wpan_get_type;
nm_setting_6lowpan_get_type;
nm_setting_connection_get_multi_connect;
nm_setting_ethtool_clear_features;
nm_setting_ethtool_get_feature;
nm_setting_ethtool_get_type;
nm_setting_ethtool_new;
nm_setting_ethtool_set_feature;
nm_setting_sriov_add_vf;
nm_setting_sriov_clear_vfs;
nm_setting_sriov_get_autoprobe_drivers;

View file

@ -47,6 +47,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (NMSettingCdma, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (NMSettingConnection, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (NMSettingDcb, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (NMSettingDummy, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (NMSettingEthtool, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (NMSettingGeneric, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (NMSettingGsm, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (NMSettingInfiniband, g_object_unref)

View file

@ -67,6 +67,7 @@ libnm-core/nm-setting-bridge.c
libnm-core/nm-setting-cdma.c
libnm-core/nm-setting-connection.c
libnm-core/nm-setting-dcb.c
libnm-core/nm-setting-ethtool.c
libnm-core/nm-setting-gsm.c
libnm-core/nm-setting-infiniband.c
libnm-core/nm-setting-ip-config.c

View file

@ -36,7 +36,9 @@ version_header = configure_file(
configuration: version_conf,
)
shared_nm_utils_nm_meta_setting_c = files('nm-meta-setting.c')
shared_nm_ethtool_utils_c = files('nm-ethtool-utils.c')
shared_nm_meta_setting_c = files('nm-meta-setting.c')
shared_nm_test_utils_impl_c = files('nm-test-utils-impl.c')

225
shared/nm-ethtool-utils.c Normal file
View file

@ -0,0 +1,225 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
* Copyright 2018 Red Hat, Inc.
*/
#include "nm-default.h"
#include "nm-ethtool-utils.h"
#include "nm-setting-ethtool.h"
/*****************************************************************************/
#define ETHT_DATA(xname) \
[NM_ETHTOOL_ID_##xname] = (&((const NMEthtoolData) { \
.optname = NM_ETHTOOL_OPTNAME_##xname, \
.id = NM_ETHTOOL_ID_##xname, \
}))
const NMEthtoolData *const nm_ethtool_data[_NM_ETHTOOL_ID_NUM + 1] = {
/* indexed by NMEthtoolID */
ETHT_DATA (FEATURE_ESP_HW_OFFLOAD),
ETHT_DATA (FEATURE_ESP_TX_CSUM_HW_OFFLOAD),
ETHT_DATA (FEATURE_FCOE_MTU),
ETHT_DATA (FEATURE_GRO),
ETHT_DATA (FEATURE_GSO),
ETHT_DATA (FEATURE_HIGHDMA),
ETHT_DATA (FEATURE_HW_TC_OFFLOAD),
ETHT_DATA (FEATURE_L2_FWD_OFFLOAD),
ETHT_DATA (FEATURE_LOOPBACK),
ETHT_DATA (FEATURE_LRO),
ETHT_DATA (FEATURE_NTUPLE),
ETHT_DATA (FEATURE_RX),
ETHT_DATA (FEATURE_RXHASH),
ETHT_DATA (FEATURE_RXVLAN),
ETHT_DATA (FEATURE_RX_ALL),
ETHT_DATA (FEATURE_RX_FCS),
ETHT_DATA (FEATURE_RX_GRO_HW),
ETHT_DATA (FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD),
ETHT_DATA (FEATURE_RX_VLAN_FILTER),
ETHT_DATA (FEATURE_RX_VLAN_STAG_FILTER),
ETHT_DATA (FEATURE_RX_VLAN_STAG_HW_PARSE),
ETHT_DATA (FEATURE_SG),
ETHT_DATA (FEATURE_TLS_HW_RECORD),
ETHT_DATA (FEATURE_TLS_HW_TX_OFFLOAD),
ETHT_DATA (FEATURE_TSO),
ETHT_DATA (FEATURE_TX),
ETHT_DATA (FEATURE_TXVLAN),
ETHT_DATA (FEATURE_TX_CHECKSUM_FCOE_CRC),
ETHT_DATA (FEATURE_TX_CHECKSUM_IPV4),
ETHT_DATA (FEATURE_TX_CHECKSUM_IPV6),
ETHT_DATA (FEATURE_TX_CHECKSUM_IP_GENERIC),
ETHT_DATA (FEATURE_TX_CHECKSUM_SCTP),
ETHT_DATA (FEATURE_TX_ESP_SEGMENTATION),
ETHT_DATA (FEATURE_TX_FCOE_SEGMENTATION),
ETHT_DATA (FEATURE_TX_GRE_CSUM_SEGMENTATION),
ETHT_DATA (FEATURE_TX_GRE_SEGMENTATION),
ETHT_DATA (FEATURE_TX_GSO_PARTIAL),
ETHT_DATA (FEATURE_TX_GSO_ROBUST),
ETHT_DATA (FEATURE_TX_IPXIP4_SEGMENTATION),
ETHT_DATA (FEATURE_TX_IPXIP6_SEGMENTATION),
ETHT_DATA (FEATURE_TX_NOCACHE_COPY),
ETHT_DATA (FEATURE_TX_SCATTER_GATHER),
ETHT_DATA (FEATURE_TX_SCATTER_GATHER_FRAGLIST),
ETHT_DATA (FEATURE_TX_SCTP_SEGMENTATION),
ETHT_DATA (FEATURE_TX_TCP6_SEGMENTATION),
ETHT_DATA (FEATURE_TX_TCP_ECN_SEGMENTATION),
ETHT_DATA (FEATURE_TX_TCP_MANGLEID_SEGMENTATION),
ETHT_DATA (FEATURE_TX_TCP_SEGMENTATION),
ETHT_DATA (FEATURE_TX_UDP_SEGMENTATION),
ETHT_DATA (FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION),
ETHT_DATA (FEATURE_TX_UDP_TNL_SEGMENTATION),
ETHT_DATA (FEATURE_TX_VLAN_STAG_HW_INSERT),
[_NM_ETHTOOL_ID_NUM] = NULL,
};
const guint8 const _by_name[_NM_ETHTOOL_ID_NUM] = {
/* sorted by optname. */
NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_FCOE_MTU,
NM_ETHTOOL_ID_FEATURE_GRO,
NM_ETHTOOL_ID_FEATURE_GSO,
NM_ETHTOOL_ID_FEATURE_HIGHDMA,
NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_LOOPBACK,
NM_ETHTOOL_ID_FEATURE_LRO,
NM_ETHTOOL_ID_FEATURE_NTUPLE,
NM_ETHTOOL_ID_FEATURE_RX,
NM_ETHTOOL_ID_FEATURE_RX_ALL,
NM_ETHTOOL_ID_FEATURE_RX_FCS,
NM_ETHTOOL_ID_FEATURE_RX_GRO_HW,
NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER,
NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER,
NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE,
NM_ETHTOOL_ID_FEATURE_RXHASH,
NM_ETHTOOL_ID_FEATURE_RXVLAN,
NM_ETHTOOL_ID_FEATURE_SG,
NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD,
NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_TSO,
NM_ETHTOOL_ID_FEATURE_TX,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP,
NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL,
NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST,
NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY,
NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER,
NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST,
NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT,
NM_ETHTOOL_ID_FEATURE_TXVLAN,
};
/*****************************************************************************/
static void
_ASSERT_data (void)
{
#if NM_MORE_ASSERTS > 10
int i;
G_STATIC_ASSERT_EXPR (_NM_ETHTOOL_ID_FIRST == 0);
G_STATIC_ASSERT_EXPR (_NM_ETHTOOL_ID_LAST == _NM_ETHTOOL_ID_NUM - 1);
G_STATIC_ASSERT_EXPR (_NM_ETHTOOL_ID_NUM > 0);
nm_assert (NM_PTRARRAY_LEN (nm_ethtool_data) == _NM_ETHTOOL_ID_NUM);
nm_assert (G_N_ELEMENTS (_by_name) == _NM_ETHTOOL_ID_NUM);
nm_assert (G_N_ELEMENTS (nm_ethtool_data) == _NM_ETHTOOL_ID_NUM + 1);
for (i = 0; i < _NM_ETHTOOL_ID_NUM; i++) {
const NMEthtoolData *d = nm_ethtool_data[i];
nm_assert (d);
nm_assert (d->id == (NMEthtoolID) i);
nm_assert (d->optname && d->optname[0]);
}
for (i = 0; i < _NM_ETHTOOL_ID_NUM; i++) {
NMEthtoolID id = _by_name[i];
const NMEthtoolData *d;
nm_assert (id >= 0);
nm_assert (id < _NM_ETHTOOL_ID_NUM);
d = nm_ethtool_data[id];
if (i > 0) {
/* since we assert that all optnames are sorted strictly monotonically increasing,
* it also follows that there are no duplicates in the _by_name.
* It also follows, that all names in nm_ethtool_data are unique. */
if (strcmp (nm_ethtool_data[_by_name[i - 1]]->optname, d->optname) >= 0) {
g_error ("nm_ethtool_data is not sorted asciibetically: %u/%s should be after %u/%s",
i - 1, nm_ethtool_data[_by_name[i - 1]]->optname,
i, d->optname);
}
}
}
#endif
}
static int
_by_name_cmp (gconstpointer a,
gconstpointer b,
gpointer user_data)
{
const guint8 *p_id = a;
const char *optname = b;
nm_assert (p_id && p_id >= _by_name && p_id <= &_by_name[_NM_ETHTOOL_ID_NUM]);
nm_assert (*p_id < _NM_ETHTOOL_ID_NUM);
return strcmp (nm_ethtool_data[*p_id]->optname, optname);
}
const NMEthtoolData *
nm_ethtool_data_get_by_optname (const char *optname)
{
gssize idx;
nm_assert (optname);
_ASSERT_data ();
idx = nm_utils_array_find_binary_search ((gconstpointer *) _by_name,
sizeof (_by_name[0]),
_NM_ETHTOOL_ID_NUM,
optname,
_by_name_cmp,
NULL);
return (idx < 0) ? NULL : nm_ethtool_data[_by_name[idx]];
}

120
shared/nm-ethtool-utils.h Normal file
View file

@ -0,0 +1,120 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
* Copyright 2018 Red Hat, Inc.
*/
#ifndef __NM_ETHTOOL_UTILS_H__
#define __NM_ETHTOOL_UTILS_H__
/*****************************************************************************/
typedef enum {
NM_ETHTOOL_ID_UNKNOWN = -1,
_NM_ETHTOOL_ID_FIRST = 0,
_NM_ETHTOOL_ID_FEATURE_FIRST = _NM_ETHTOOL_ID_FIRST,
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,
NM_ETHTOOL_ID_FEATURE_GRO,
NM_ETHTOOL_ID_FEATURE_GSO,
NM_ETHTOOL_ID_FEATURE_HIGHDMA,
NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_LOOPBACK,
NM_ETHTOOL_ID_FEATURE_LRO,
NM_ETHTOOL_ID_FEATURE_NTUPLE,
NM_ETHTOOL_ID_FEATURE_RX,
NM_ETHTOOL_ID_FEATURE_RXHASH,
NM_ETHTOOL_ID_FEATURE_RXVLAN,
NM_ETHTOOL_ID_FEATURE_RX_ALL,
NM_ETHTOOL_ID_FEATURE_RX_FCS,
NM_ETHTOOL_ID_FEATURE_RX_GRO_HW,
NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER,
NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER,
NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE,
NM_ETHTOOL_ID_FEATURE_SG,
NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD,
NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_TSO,
NM_ETHTOOL_ID_FEATURE_TX,
NM_ETHTOOL_ID_FEATURE_TXVLAN,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC,
NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP,
NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL,
NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST,
NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY,
NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER,
NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST,
NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION,
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_NUM = (_NM_ETHTOOL_ID_LAST - _NM_ETHTOOL_ID_FIRST + 1),
} NMEthtoolID;
typedef struct {
const char *optname;
NMEthtoolID id;
} NMEthtoolData;
extern const NMEthtoolData *const nm_ethtool_data[/*_NM_ETHTOOL_ID_NUM + NULL-terminated*/];
const NMEthtoolData *nm_ethtool_data_get_by_optname (const char *optname);
/****************************************************************************/
static inline NMEthtoolID
nm_ethtool_id_get_by_name (const char *optname)
{
const NMEthtoolData *d;
d = nm_ethtool_data_get_by_optname (optname);
return d ? d->id : NM_ETHTOOL_ID_UNKNOWN;
}
static inline gboolean
nm_ethtool_id_is_feature (NMEthtoolID id)
{
return id >= _NM_ETHTOOL_ID_FEATURE_FIRST && id <= _NM_ETHTOOL_ID_FEATURE_LAST;
}
/****************************************************************************/
#endif /* __NM_ETHTOOL_UTILS_H__ */

View file

@ -34,6 +34,7 @@
#include "nm-setting-connection.h"
#include "nm-setting-dcb.h"
#include "nm-setting-dummy.h"
#include "nm-setting-ethtool.h"
#include "nm-setting-generic.h"
#include "nm-setting-gsm.h"
#include "nm-setting-infiniband.h"
@ -149,211 +150,259 @@ const NMSetting8021xSchemeVtable nm_setting_8021x_scheme_vtable[] = {
const NMMetaSettingInfo nm_meta_setting_infos[] = {
[NM_META_SETTING_TYPE_6LOWPAN] = {
.meta_type = NM_META_SETTING_TYPE_6LOWPAN,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_6LOWPAN_SETTING_NAME,
.get_setting_gtype = nm_setting_6lowpan_get_type,
},
[NM_META_SETTING_TYPE_802_1X] = {
.meta_type = NM_META_SETTING_TYPE_802_1X,
.setting_priority = NM_SETTING_PRIORITY_HW_AUX,
.setting_name = NM_SETTING_802_1X_SETTING_NAME,
.get_setting_gtype = nm_setting_802_1x_get_type,
},
[NM_META_SETTING_TYPE_ADSL] = {
.meta_type = NM_META_SETTING_TYPE_ADSL,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_ADSL_SETTING_NAME,
.get_setting_gtype = nm_setting_adsl_get_type,
},
[NM_META_SETTING_TYPE_BLUETOOTH] = {
.meta_type = NM_META_SETTING_TYPE_BLUETOOTH,
.setting_priority = NM_SETTING_PRIORITY_HW_NON_BASE,
.setting_name = NM_SETTING_BLUETOOTH_SETTING_NAME,
.get_setting_gtype = nm_setting_bluetooth_get_type,
},
[NM_META_SETTING_TYPE_BOND] = {
.meta_type = NM_META_SETTING_TYPE_BOND,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_BOND_SETTING_NAME,
.get_setting_gtype = nm_setting_bond_get_type,
},
[NM_META_SETTING_TYPE_BRIDGE] = {
.meta_type = NM_META_SETTING_TYPE_BRIDGE,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_BRIDGE_SETTING_NAME,
.get_setting_gtype = nm_setting_bridge_get_type,
},
[NM_META_SETTING_TYPE_BRIDGE_PORT] = {
.meta_type = NM_META_SETTING_TYPE_BRIDGE_PORT,
.setting_priority = NM_SETTING_PRIORITY_AUX,
.setting_name = NM_SETTING_BRIDGE_PORT_SETTING_NAME,
.get_setting_gtype = nm_setting_bridge_port_get_type,
},
[NM_META_SETTING_TYPE_CDMA] = {
.meta_type = NM_META_SETTING_TYPE_CDMA,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_CDMA_SETTING_NAME,
.get_setting_gtype = nm_setting_cdma_get_type,
},
[NM_META_SETTING_TYPE_CONNECTION] = {
.meta_type = NM_META_SETTING_TYPE_CONNECTION,
.setting_priority = NM_SETTING_PRIORITY_CONNECTION,
.setting_name = NM_SETTING_CONNECTION_SETTING_NAME,
.get_setting_gtype = nm_setting_connection_get_type,
},
[NM_META_SETTING_TYPE_DCB] = {
.meta_type = NM_META_SETTING_TYPE_DCB,
.setting_priority = NM_SETTING_PRIORITY_HW_AUX,
.setting_name = NM_SETTING_DCB_SETTING_NAME,
.get_setting_gtype = nm_setting_dcb_get_type,
},
[NM_META_SETTING_TYPE_DUMMY] = {
.meta_type = NM_META_SETTING_TYPE_DUMMY,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_DUMMY_SETTING_NAME,
.get_setting_gtype = nm_setting_dummy_get_type,
},
[NM_META_SETTING_TYPE_ETHTOOL] = {
.meta_type = NM_META_SETTING_TYPE_ETHTOOL,
.setting_priority = NM_SETTING_PRIORITY_AUX,
.setting_name = NM_SETTING_ETHTOOL_SETTING_NAME,
.get_setting_gtype = nm_setting_ethtool_get_type,
},
[NM_META_SETTING_TYPE_GENERIC] = {
.meta_type = NM_META_SETTING_TYPE_GENERIC,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_GENERIC_SETTING_NAME,
.get_setting_gtype = nm_setting_generic_get_type,
},
[NM_META_SETTING_TYPE_GSM] = {
.meta_type = NM_META_SETTING_TYPE_GSM,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_GSM_SETTING_NAME,
.get_setting_gtype = nm_setting_gsm_get_type,
},
[NM_META_SETTING_TYPE_INFINIBAND] = {
.meta_type = NM_META_SETTING_TYPE_INFINIBAND,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_INFINIBAND_SETTING_NAME,
.get_setting_gtype = nm_setting_infiniband_get_type,
},
[NM_META_SETTING_TYPE_IP4_CONFIG] = {
.meta_type = NM_META_SETTING_TYPE_IP4_CONFIG,
.setting_priority = NM_SETTING_PRIORITY_IP,
.setting_name = NM_SETTING_IP4_CONFIG_SETTING_NAME,
.get_setting_gtype = nm_setting_ip4_config_get_type,
},
[NM_META_SETTING_TYPE_IP6_CONFIG] = {
.meta_type = NM_META_SETTING_TYPE_IP6_CONFIG,
.setting_priority = NM_SETTING_PRIORITY_IP,
.setting_name = NM_SETTING_IP6_CONFIG_SETTING_NAME,
.get_setting_gtype = nm_setting_ip6_config_get_type,
},
[NM_META_SETTING_TYPE_IP_TUNNEL] = {
.meta_type = NM_META_SETTING_TYPE_IP_TUNNEL,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_IP_TUNNEL_SETTING_NAME,
.get_setting_gtype = nm_setting_ip_tunnel_get_type,
},
[NM_META_SETTING_TYPE_MACSEC] = {
.meta_type = NM_META_SETTING_TYPE_MACSEC,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_MACSEC_SETTING_NAME,
.get_setting_gtype = nm_setting_macsec_get_type,
},
[NM_META_SETTING_TYPE_MACVLAN] = {
.meta_type = NM_META_SETTING_TYPE_MACVLAN,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_MACVLAN_SETTING_NAME,
.get_setting_gtype = nm_setting_macvlan_get_type,
},
[NM_META_SETTING_TYPE_OLPC_MESH] = {
.meta_type = NM_META_SETTING_TYPE_OLPC_MESH,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_OLPC_MESH_SETTING_NAME,
.get_setting_gtype = nm_setting_olpc_mesh_get_type,
},
[NM_META_SETTING_TYPE_OVS_BRIDGE] = {
.meta_type = NM_META_SETTING_TYPE_OVS_BRIDGE,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_OVS_BRIDGE_SETTING_NAME,
.get_setting_gtype = nm_setting_ovs_bridge_get_type,
},
[NM_META_SETTING_TYPE_OVS_INTERFACE] = {
.meta_type = NM_META_SETTING_TYPE_OVS_INTERFACE,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_OVS_INTERFACE_SETTING_NAME,
.get_setting_gtype = nm_setting_ovs_interface_get_type,
},
[NM_META_SETTING_TYPE_OVS_PATCH] = {
.meta_type = NM_META_SETTING_TYPE_OVS_PATCH,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_OVS_PATCH_SETTING_NAME,
.get_setting_gtype = nm_setting_ovs_patch_get_type,
},
[NM_META_SETTING_TYPE_OVS_PORT] = {
.meta_type = NM_META_SETTING_TYPE_OVS_PORT,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_OVS_PORT_SETTING_NAME,
.get_setting_gtype = nm_setting_ovs_port_get_type,
},
[NM_META_SETTING_TYPE_PPPOE] = {
.meta_type = NM_META_SETTING_TYPE_PPPOE,
.setting_priority = NM_SETTING_PRIORITY_AUX,
.setting_name = NM_SETTING_PPPOE_SETTING_NAME,
.get_setting_gtype = nm_setting_pppoe_get_type,
},
[NM_META_SETTING_TYPE_PPP] = {
.meta_type = NM_META_SETTING_TYPE_PPP,
.setting_priority = NM_SETTING_PRIORITY_AUX,
.setting_name = NM_SETTING_PPP_SETTING_NAME,
.get_setting_gtype = nm_setting_ppp_get_type,
},
[NM_META_SETTING_TYPE_PROXY] = {
.meta_type = NM_META_SETTING_TYPE_PROXY,
.setting_priority = NM_SETTING_PRIORITY_IP,
.setting_name = NM_SETTING_PROXY_SETTING_NAME,
.get_setting_gtype = nm_setting_proxy_get_type,
},
[NM_META_SETTING_TYPE_SERIAL] = {
.meta_type = NM_META_SETTING_TYPE_SERIAL,
.setting_priority = NM_SETTING_PRIORITY_HW_AUX,
.setting_name = NM_SETTING_SERIAL_SETTING_NAME,
.get_setting_gtype = nm_setting_serial_get_type,
},
[NM_META_SETTING_TYPE_SRIOV] = {
.meta_type = NM_META_SETTING_TYPE_SRIOV,
.setting_priority = NM_SETTING_PRIORITY_HW_AUX,
.setting_name = NM_SETTING_SRIOV_SETTING_NAME,
.get_setting_gtype = nm_setting_sriov_get_type,
},
[NM_META_SETTING_TYPE_TC_CONFIG] = {
.meta_type = NM_META_SETTING_TYPE_TC_CONFIG,
.setting_priority = NM_SETTING_PRIORITY_IP,
.setting_name = NM_SETTING_TC_CONFIG_SETTING_NAME,
.get_setting_gtype = nm_setting_tc_config_get_type,
},
[NM_META_SETTING_TYPE_TEAM] = {
.meta_type = NM_META_SETTING_TYPE_TEAM,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_TEAM_SETTING_NAME,
.get_setting_gtype = nm_setting_team_get_type,
},
[NM_META_SETTING_TYPE_TEAM_PORT] = {
.meta_type = NM_META_SETTING_TYPE_TEAM_PORT,
.setting_priority = NM_SETTING_PRIORITY_AUX,
.setting_name = NM_SETTING_TEAM_PORT_SETTING_NAME,
.get_setting_gtype = nm_setting_team_port_get_type,
},
[NM_META_SETTING_TYPE_TUN] = {
.meta_type = NM_META_SETTING_TYPE_TUN,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_TUN_SETTING_NAME,
.get_setting_gtype = nm_setting_tun_get_type,
},
[NM_META_SETTING_TYPE_USER] = {
.meta_type = NM_META_SETTING_TYPE_USER,
.setting_priority = NM_SETTING_PRIORITY_USER,
.setting_name = NM_SETTING_USER_SETTING_NAME,
.get_setting_gtype = nm_setting_user_get_type,
},
[NM_META_SETTING_TYPE_VLAN] = {
.meta_type = NM_META_SETTING_TYPE_VLAN,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_VLAN_SETTING_NAME,
.get_setting_gtype = nm_setting_vlan_get_type,
},
[NM_META_SETTING_TYPE_VPN] = {
.meta_type = NM_META_SETTING_TYPE_VPN,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_VPN_SETTING_NAME,
.get_setting_gtype = nm_setting_vpn_get_type,
},
[NM_META_SETTING_TYPE_VXLAN] = {
.meta_type = NM_META_SETTING_TYPE_VXLAN,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_VXLAN_SETTING_NAME,
.get_setting_gtype = nm_setting_vxlan_get_type,
},
[NM_META_SETTING_TYPE_WIMAX] = {
.meta_type = NM_META_SETTING_TYPE_WIMAX,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_WIMAX_SETTING_NAME,
.get_setting_gtype = nm_setting_wimax_get_type,
},
[NM_META_SETTING_TYPE_WIRED] = {
.meta_type = NM_META_SETTING_TYPE_WIRED,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_WIRED_SETTING_NAME,
.get_setting_gtype = nm_setting_wired_get_type,
},
[NM_META_SETTING_TYPE_WIRELESS] = {
.meta_type = NM_META_SETTING_TYPE_WIRELESS,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_WIRELESS_SETTING_NAME,
.get_setting_gtype = nm_setting_wireless_get_type,
},
[NM_META_SETTING_TYPE_WIRELESS_SECURITY] = {
.meta_type = NM_META_SETTING_TYPE_WIRELESS_SECURITY,
.setting_priority = NM_SETTING_PRIORITY_HW_AUX,
.setting_name = NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
.get_setting_gtype = nm_setting_wireless_security_get_type,
},
[NM_META_SETTING_TYPE_WPAN] = {
.meta_type = NM_META_SETTING_TYPE_WPAN,
.setting_priority = NM_SETTING_PRIORITY_HW_BASE,
.setting_name = NM_SETTING_WPAN_SETTING_NAME,
.get_setting_gtype = nm_setting_wpan_get_type,
},
@ -366,27 +415,99 @@ const NMMetaSettingInfo nm_meta_setting_infos[] = {
const NMMetaSettingInfo *
nm_meta_setting_infos_by_name (const char *name)
{
int i;
gssize idx;
#if NM_MORE_ASSERTS > 10
{
guint i, j;
if (name) {
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
if (nm_streq (nm_meta_setting_infos[i].setting_name, name))
return &nm_meta_setting_infos[i];
const NMMetaSettingInfo *setting_info = &nm_meta_setting_infos[i];
nm_assert (setting_info->meta_type == (NMMetaSettingType) i);
nm_assert (setting_info->setting_name);
nm_assert (setting_info->setting_name[0]);
nm_assert (setting_info->get_setting_gtype);
nm_assert (setting_info->setting_priority != NM_SETTING_PRIORITY_INVALID);
if ( i > 0
&& strcmp (nm_meta_setting_infos[i - 1].setting_name, setting_info->setting_name) >= 0) {
g_error ("nm_meta_setting_infos[%u, \"%s\"] is wrongly sorted before nm_meta_setting_infos[%u, \"%s\"]. Rearange NMMetaSettingType enum",
i - 1, nm_meta_setting_infos[i - 1].setting_name,
i, setting_info->setting_name);
}
for (j = 0; j < i; j++) {
const NMMetaSettingInfo *s = &nm_meta_setting_infos[j];
nm_assert (setting_info->get_setting_gtype != s->get_setting_gtype);
}
}
}
return NULL;
#endif
G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (NMMetaSettingInfo, setting_name) == 0);
idx = nm_utils_array_find_binary_search (nm_meta_setting_infos,
sizeof (NMMetaSettingInfo),
_NM_META_SETTING_TYPE_NUM,
&name,
nm_strcmp_p_with_data,
NULL);
return idx >= 0 ? &nm_meta_setting_infos[idx] : NULL;
}
const NMMetaSettingInfo *
nm_meta_setting_infos_by_gtype (GType gtype)
{
int i;
#if ((NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_INTERNAL)
nm_auto_unref_gtypeclass GTypeClass *gtypeclass_unref = NULL;
GTypeClass *gtypeclass;
NMSettingClass *klass;
if (!g_type_is_a (gtype, NM_TYPE_SETTING))
goto out_none;
gtypeclass = g_type_class_peek (gtype);
if (!gtypeclass)
gtypeclass = gtypeclass_unref = g_type_class_ref (gtype);
nm_assert (NM_IS_SETTING_CLASS (gtypeclass));
klass = (NMSettingClass *) gtypeclass;
if (!klass->setting_info)
goto out_none;
nm_assert (klass->setting_info->get_setting_gtype);
nm_assert (klass->setting_info->get_setting_gtype () == gtype);
return klass->setting_info;
out_none:
#if NM_MORE_ASSERTS > 10
{
int i;
/* this might hint to a bug, but it would be expected for NM_TYPE_SETTING
* and NM_TYPE_SETTING_IP_CONFIG.
*
* Assert that we didn't lookup for a gtype, which we would expect to find.
* An assertion failure here, hints to a bug in nm_setting_*_class_init().
*/
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++)
nm_assert (nm_meta_setting_infos[i].get_setting_gtype () != gtype);
}
#endif
return NULL;
#else
guint i;
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
if (nm_meta_setting_infos[i].get_setting_gtype () == gtype)
return &nm_meta_setting_infos[i];
}
return NULL;
#endif
}
/*****************************************************************************/

View file

@ -26,6 +26,47 @@
/*****************************************************************************/
/*
* A setting's priority should roughly follow the OSI layer model, but it also
* controls which settings get asked for secrets first. Thus settings which
* relate to things that must be working first, like hardware, should get a
* higher priority than things which layer on top of the hardware. For example,
* the GSM/CDMA settings should provide secrets before the PPP setting does,
* because a PIN is required to unlock the device before PPP can even start.
* Even settings without secrets should be assigned the right priority.
*
* 0: reserved for invalid
*
* 1: reserved for the Connection setting
*
* 2,3: hardware-related settings like Ethernet, Wi-Fi, InfiniBand, Bridge, etc.
* These priority 1 settings are also "base types", which means that at least
* one of them is required for the connection to be valid, and their name is
* valid in the 'type' property of the Connection setting.
*
* 4: hardware-related auxiliary settings that require a base setting to be
* successful first, like Wi-Fi security, 802.1x, etc.
*
* 5: hardware-independent settings that are required before IP connectivity
* can be established, like PPP, PPPoE, etc.
*
* 6: IP-level stuff
*
* 10: NMSettingUser
*/
typedef enum { /*< skip >*/
NM_SETTING_PRIORITY_INVALID = 0,
NM_SETTING_PRIORITY_CONNECTION = 1,
NM_SETTING_PRIORITY_HW_BASE = 2,
NM_SETTING_PRIORITY_HW_NON_BASE = 3,
NM_SETTING_PRIORITY_HW_AUX = 4,
NM_SETTING_PRIORITY_AUX = 5,
NM_SETTING_PRIORITY_IP = 6,
NM_SETTING_PRIORITY_USER = 10,
} NMSettingPriority;
/*****************************************************************************/
typedef enum {
NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT,
NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT,
@ -56,8 +97,18 @@ extern const NMSetting8021xSchemeVtable nm_setting_8021x_scheme_vtable[_NM_SETTI
/*****************************************************************************/
typedef enum {
/* the enum (and their numeric values) are internal API. Do not assign
* any meaning the numeric values, because they already have one:
*
* they are sorted in a way, that corresponds to the asciibetical sort
* order of the corresponding setting-name. */
NM_META_SETTING_TYPE_6LOWPAN,
NM_META_SETTING_TYPE_OLPC_MESH,
NM_META_SETTING_TYPE_WIRELESS,
NM_META_SETTING_TYPE_WIRELESS_SECURITY,
NM_META_SETTING_TYPE_802_1X,
NM_META_SETTING_TYPE_WIRED,
NM_META_SETTING_TYPE_ADSL,
NM_META_SETTING_TYPE_BLUETOOTH,
NM_META_SETTING_TYPE_BOND,
@ -67,15 +118,15 @@ typedef enum {
NM_META_SETTING_TYPE_CONNECTION,
NM_META_SETTING_TYPE_DCB,
NM_META_SETTING_TYPE_DUMMY,
NM_META_SETTING_TYPE_ETHTOOL,
NM_META_SETTING_TYPE_GENERIC,
NM_META_SETTING_TYPE_GSM,
NM_META_SETTING_TYPE_INFINIBAND,
NM_META_SETTING_TYPE_IP_TUNNEL,
NM_META_SETTING_TYPE_IP4_CONFIG,
NM_META_SETTING_TYPE_IP6_CONFIG,
NM_META_SETTING_TYPE_IP_TUNNEL,
NM_META_SETTING_TYPE_MACSEC,
NM_META_SETTING_TYPE_MACVLAN,
NM_META_SETTING_TYPE_OLPC_MESH,
NM_META_SETTING_TYPE_OVS_BRIDGE,
NM_META_SETTING_TYPE_OVS_INTERFACE,
NM_META_SETTING_TYPE_OVS_PATCH,
@ -94,9 +145,6 @@ typedef enum {
NM_META_SETTING_TYPE_VPN,
NM_META_SETTING_TYPE_VXLAN,
NM_META_SETTING_TYPE_WIMAX,
NM_META_SETTING_TYPE_WIRED,
NM_META_SETTING_TYPE_WIRELESS,
NM_META_SETTING_TYPE_WIRELESS_SECURITY,
NM_META_SETTING_TYPE_WPAN,
NM_META_SETTING_TYPE_UNKNOWN,
@ -104,12 +152,50 @@ typedef enum {
_NM_META_SETTING_TYPE_NUM = NM_META_SETTING_TYPE_UNKNOWN,
} NMMetaSettingType;
typedef struct {
NMMetaSettingType meta_type;
/* this header is statically linked with both libnm-core.la and libnmc.la.
* Though, there is no stable API/ABI, so whenever on of these components
* accesses NMMetaSettingInfo or NMMetaSettingType, it only has meaning
* inside the same component.
*
* Note how NMSettingClass has field of type "struct _NMMetaSettingInfo".
* It would be a serious bug, if libnmc tries to interpret this pointer
* with the meaning of NMMetaSettingInfo. They might be different, because
* libnm.so (libnm-core.la) might be a newer version than nmcli (libnmc.la).
*
* This define helps to ensure that we don't accidentally use the pointer
* in different contexts. */
#if ((NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_INTERNAL)
#define _NMMetaSettingInfoXX _NMMetaSettingInfo
#else
#define _NMMetaSettingInfoXX _NMMetaSettingInfoCli
#endif
struct _NMMetaSettingInfoXX {
const char *setting_name;
GType (*get_setting_gtype) (void);
} NMMetaSettingInfo;
NMMetaSettingType meta_type;
NMSettingPriority setting_priority;
};
typedef struct _NMMetaSettingInfoXX NMMetaSettingInfo;
/* note that we statically link nm-meta-setting.h both to libnm-core.la and
* libnmc.la. That means, there are two versions of nm_meta_setting_infos
* in nmcli. That is not easily avoidable, because at this point, we don't
* want yet to making it public API.
*
* Eventually, this should become public API of libnm, and nmcli/libnmc.la
* should use that version.
*
* Downsides of the current solution:
*
* - duplication of the array in nmcli.
*
* - there is no stable API/ABI. That means, when you have a NMMetaSettingInfo
* pointer, or a NMMetaSettingType value, the value can only be used within
* the current context (libnm-core.la or libnmc.la). In other words, libnmc.la
* (and nmcli) must never access a NMMetaSettingInfo/NMMetaSettingType value,
* that comes from libnm-core.la.
*/
extern const NMMetaSettingInfo nm_meta_setting_infos[_NM_META_SETTING_TYPE_NUM + 1];
const NMMetaSettingInfo *nm_meta_setting_infos_by_name (const char *name);

View file

@ -1137,6 +1137,14 @@ nm_clear_g_cancellable (GCancellable **cancellable)
&& ((__x & (__x - (((typeof(__x)) 1)))) == ((typeof(__x)) 0))); \
})
#define NM_DIV_ROUND_UP(x, y) \
({ \
const typeof(x) _x = (x); \
const typeof(y) _y = (y); \
\
(_x / _y + !!(_x % _y)); \
})
/*****************************************************************************/
#define NM_UTILS_LOOKUP_DEFAULT(v) return (v)

View file

@ -1350,6 +1350,209 @@ nm_utils_strv_make_deep_copied (const char **strv)
/*****************************************************************************/
gssize
nm_utils_ptrarray_find_binary_search (gconstpointer *list,
gsize len,
gconstpointer needle,
GCompareDataFunc cmpfcn,
gpointer user_data,
gssize *out_idx_first,
gssize *out_idx_last)
{
gssize imin, imax, imid, i2min, i2max, i2mid;
int cmp;
g_return_val_if_fail (list || !len, ~((gssize) 0));
g_return_val_if_fail (cmpfcn, ~((gssize) 0));
imin = 0;
if (len > 0) {
imax = len - 1;
while (imin <= imax) {
imid = imin + (imax - imin) / 2;
cmp = cmpfcn (list[imid], needle, user_data);
if (cmp == 0) {
/* we found a matching entry at index imid.
*
* Does the caller request the first/last index as well (in case that
* there are multiple entries which compare equal). */
if (out_idx_first) {
i2min = imin;
i2max = imid + 1;
while (i2min <= i2max) {
i2mid = i2min + (i2max - i2min) / 2;
cmp = cmpfcn (list[i2mid], needle, user_data);
if (cmp == 0)
i2max = i2mid -1;
else {
nm_assert (cmp < 0);
i2min = i2mid + 1;
}
}
*out_idx_first = i2min;
}
if (out_idx_last) {
i2min = imid + 1;
i2max = imax;
while (i2min <= i2max) {
i2mid = i2min + (i2max - i2min) / 2;
cmp = cmpfcn (list[i2mid], needle, user_data);
if (cmp == 0)
i2min = i2mid + 1;
else {
nm_assert (cmp > 0);
i2max = i2mid - 1;
}
}
*out_idx_last = i2min - 1;
}
return imid;
}
if (cmp < 0)
imin = imid + 1;
else
imax = imid - 1;
}
}
/* return the inverse of @imin. This is a negative number, but
* also is ~imin the position where the value should be inserted. */
imin = ~imin;
NM_SET_OUT (out_idx_first, imin);
NM_SET_OUT (out_idx_last, imin);
return imin;
}
/*****************************************************************************/
/**
* nm_utils_array_find_binary_search:
* @list: the list to search. It must be sorted according to @cmpfcn ordering.
* @elem_size: the size in bytes of each element in the list
* @len: the number of elements in @list
* @needle: the value that is searched
* @cmpfcn: the compare function. The elements @list are passed as first
* argument to @cmpfcn, while @needle is passed as second. Usually, the
* needle is the same data type as inside the list, however, that is
* not necessary, as long as @cmpfcn takes care to cast the two arguments
* accordingly.
* @user_data: optional argument passed to @cmpfcn
*
* Performs binary search for @needle in @list. On success, returns the
* (non-negative) index where the compare function found the searched element.
* On success, it returns a negative value. Note that the return negative value
* is the bitwise inverse of the position where the element should be inserted.
*
* If the list contains multiple matching elements, an arbitrary index is
* returned.
*
* Returns: the index to the element in the list, or the (negative, bitwise inverted)
* position where it should be.
*/
gssize
nm_utils_array_find_binary_search (gconstpointer list,
gsize elem_size,
gsize len,
gconstpointer needle,
GCompareDataFunc cmpfcn,
gpointer user_data)
{
gssize imin, imax, imid;
int cmp;
g_return_val_if_fail (list || !len, ~((gssize) 0));
g_return_val_if_fail (cmpfcn, ~((gssize) 0));
g_return_val_if_fail (elem_size > 0, ~((gssize) 0));
imin = 0;
if (len == 0)
return ~imin;
imax = len - 1;
while (imin <= imax) {
imid = imin + (imax - imin) / 2;
cmp = cmpfcn (&((const char *) list)[elem_size * imid], needle, user_data);
if (cmp == 0)
return imid;
if (cmp < 0)
imin = imid + 1;
else
imax = imid - 1;
}
/* return the inverse of @imin. This is a negative number, but
* also is ~imin the position where the value should be inserted. */
return ~imin;
}
/*****************************************************************************/
/**
* nm_utils_hash_table_equal:
* @a: one #GHashTable
* @b: other #GHashTable
* @treat_null_as_empty: if %TRUE, when either @a or @b is %NULL, it is
* treated like an empty hash. It means, a %NULL hash will compare equal
* to an empty hash.
* @equal_func: the equality function, for comparing the values.
* If %NULL, the values are not compared. In that case, the function
* only checks, if both dictionaries have the same keys -- according
* to @b's key equality function.
* Note that the values of @a will be passed as first argument
* to @equal_func.
*
* Compares two hash tables, whether they have equal content.
* This only makes sense, if @a and @b have the same key types and
* the same key compare-function.
*
* Returns: %TRUE, if both dictionaries have the same content.
*/
gboolean
nm_utils_hash_table_equal (const GHashTable *a,
const GHashTable *b,
gboolean treat_null_as_empty,
NMUtilsHashTableEqualFunc equal_func)
{
guint n;
GHashTableIter iter;
gconstpointer key, v_a, v_b;
if (a == b)
return TRUE;
if (!treat_null_as_empty) {
if (!a || !b)
return FALSE;
}
n = a ? g_hash_table_size ((GHashTable *) a) : 0;
if (n != (b ? g_hash_table_size ((GHashTable *) b) : 0))
return FALSE;
if (n > 0) {
g_hash_table_iter_init (&iter, (GHashTable *) a);
while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &v_a)) {
if (!g_hash_table_lookup_extended ((GHashTable *) b, key, NULL, (gpointer *) &v_b))
return FALSE;
if ( equal_func
&& !equal_func (v_a, v_b))
return FALSE;
}
}
return TRUE;
}
/*****************************************************************************/
/**
* nm_utils_get_start_time_for_pid:
* @pid: the process identifier

View file

@ -555,6 +555,35 @@ nm_utils_strv_make_deep_copied_nonnull (const char **strv)
return nm_utils_strv_make_deep_copied (strv) ?: g_new0 (char *, 1);
}
/*****************************************************************************/
gssize nm_utils_ptrarray_find_binary_search (gconstpointer *list,
gsize len,
gconstpointer needle,
GCompareDataFunc cmpfcn,
gpointer user_data,
gssize *out_idx_first,
gssize *out_idx_last);
gssize nm_utils_array_find_binary_search (gconstpointer list,
gsize elem_size,
gsize len,
gconstpointer needle,
GCompareDataFunc cmpfcn,
gpointer user_data);
/*****************************************************************************/
typedef gboolean (*NMUtilsHashTableEqualFunc) (gconstpointer a,
gconstpointer b);
gboolean nm_utils_hash_table_equal (const GHashTable *a,
const GHashTable *b,
gboolean treat_null_as_empty,
NMUtilsHashTableEqualFunc equal_func);
/*****************************************************************************/
void _nm_utils_strv_sort (const char **strv, gssize len);
#define nm_utils_strv_sort(strv, len) _nm_utils_strv_sort (NM_CAST_STRV_MC (strv), len)

View file

@ -43,6 +43,7 @@
#include "nm-utils/nm-random-utils.h"
#include "nm-utils/unaligned.h"
#include "nm-ethtool-utils.h"
#include "nm-common-macros.h"
#include "nm-device-private.h"
#include "NetworkManagerUtils.h"
@ -65,6 +66,7 @@
#include "nm-firewall-manager.h"
#include "settings/nm-settings-connection.h"
#include "settings/nm-settings.h"
#include "nm-setting-ethtool.h"
#include "nm-auth-utils.h"
#include "nm-netns.h"
#include "nm-dispatcher.h"
@ -172,6 +174,12 @@ struct _NMDeviceConnectivityHandle {
bool is_periodic_bump_on_complete:1;
};
typedef struct {
int ifindex;
NMEthtoolFeatureStates *features;
NMTernary requested[_NM_ETHTOOL_ID_FEATURE_NUM];
} EthtoolState;
/*****************************************************************************/
enum {
@ -508,6 +516,8 @@ typedef struct _NMDevicePrivate {
GHashTable * ip6_saved_properties;
EthtoolState *ethtool_state;
struct {
NMDhcpClient * client;
NMNDiscDHCPLevel mode;
@ -740,6 +750,79 @@ NM_UTILS_LOOKUP_STR_DEFINE_STATIC (mtu_source_to_str, NMDeviceMtuSource,
/*****************************************************************************/
static void
_ethtool_state_reset (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
if (priv->ethtool_state) {
gs_free NMEthtoolFeatureStates *features = priv->ethtool_state->features;
gs_free EthtoolState *ethtool_state = g_steal_pointer (&priv->ethtool_state);
if (!nm_platform_ethtool_set_features (nm_device_get_platform (self),
ethtool_state->ifindex,
features,
ethtool_state->requested,
FALSE))
_LOGW (LOGD_DEVICE, "ethtool: failure resetting one or more offload features");
else
_LOGD (LOGD_DEVICE, "ethtool: offload features successfully reset");
}
}
static void
_ethtool_state_set (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
int ifindex;
NMConnection *connection;
NMSettingEthtool *s_ethtool;
NMPlatform *platform;
gs_free EthtoolState *ethtool_state = NULL;
gs_free NMEthtoolFeatureStates *features = NULL;
_ethtool_state_reset (self);
connection = nm_device_get_applied_connection (self);
if (!connection)
return;
ifindex = nm_device_get_ip_ifindex (self);
if (ifindex <= 0)
return;
s_ethtool = NM_SETTING_ETHTOOL (nm_connection_get_setting (connection, NM_TYPE_SETTING_ETHTOOL));
if (!s_ethtool)
return;
ethtool_state = g_new (EthtoolState, 1);
if (nm_setting_ethtool_init_features (s_ethtool, ethtool_state->requested) == 0)
return;
platform = nm_device_get_platform (self);
features = nm_platform_ethtool_get_link_features (platform, ifindex);
if (!features) {
_LOGW (LOGD_DEVICE, "ethtool: failure setting offload features (cannot read features)");
return;
}
if (!nm_platform_ethtool_set_features (platform,
ifindex,
features,
ethtool_state->requested,
TRUE))
_LOGW (LOGD_DEVICE, "ethtool: failure setting one or more offload features");
else
_LOGD (LOGD_DEVICE, "ethtool: offload features successfully set");
ethtool_state->ifindex = ifindex;
ethtool_state->features = g_steal_pointer (&features);
priv->ethtool_state = g_steal_pointer (&ethtool_state);
}
/*****************************************************************************/
NMSettings *
nm_device_get_settings (NMDevice *self)
{
@ -6228,6 +6311,8 @@ activate_stage2_device_config (NMDevice *self)
if (!nm_device_sys_iface_state_is_external_or_assume (self)) {
NMDeviceStateReason failure_reason = NM_DEVICE_STATE_REASON_NONE;
_ethtool_state_set (self);
if (!tc_commit (self)) {
_LOGW (LOGD_IP6, "failed applying traffic control rules");
nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_CONFIG_FAILED);
@ -14022,6 +14107,8 @@ nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason, CleanupType clean
priv->ip6_mtu_initial = 0;
}
_ethtool_state_reset (self);
_cleanup_generic_post (self, cleanup_type);
}

View file

@ -655,12 +655,12 @@ nm_config_data_log (const NMConfigData *self,
const char *group = default_values[g].group;
gssize idx;
idx = _nm_utils_array_find_binary_search ((gconstpointer *) groups_full->pdata,
sizeof (char *),
groups_full->len,
&group,
(GCompareDataFunc) _nm_config_data_log_sort,
NULL);
idx = nm_utils_array_find_binary_search ((gconstpointer *) groups_full->pdata,
sizeof (char *),
groups_full->len,
&group,
(GCompareDataFunc) _nm_config_data_log_sort,
NULL);
if (idx < 0)
g_ptr_array_insert (groups_full, (~idx), (gpointer) group);
}

View file

@ -6796,12 +6796,12 @@ nm_manager_set_capability (NMManager *self,
priv = NM_MANAGER_GET_PRIVATE (self);
idx = _nm_utils_array_find_binary_search (&g_array_index (priv->capabilities, guint32, 0),
sizeof (guint32),
priv->capabilities->len,
&cap_i,
nm_cmp_uint32_p_with_data,
NULL);
idx = nm_utils_array_find_binary_search (&g_array_index (priv->capabilities, guint32, 0),
sizeof (guint32),
priv->capabilities->len,
&cap_i,
nm_cmp_uint32_p_with_data,
NULL);
if (idx >= 0)
return;

View file

@ -36,12 +36,15 @@
#include "nm-utils.h"
#include "nm-setting-wired.h"
#include "nm-ethtool-utils.h"
#include "nm-core-utils.h"
/******************************************************************
#define ONOFF(bool_val) ((bool_val) ? "on" : "off")
/******************************************************************************
* utils
******************************************************************/
*****************************************************************************/
extern char *if_indextoname (unsigned __ifindex, char *__ifname);
unsigned if_nametoindex (const char *__ifname);
@ -63,9 +66,45 @@ nmp_utils_if_nametoindex (const char *ifname)
return if_nametoindex (ifname);
}
/******************************************************************
/*****************************************************************************/
typedef struct {
int fd;
int ifindex;
char ifname[IFNAMSIZ];
} SocketHandle;
static int
socket_handle_init (SocketHandle *shandle, int ifindex)
{
if (!nmp_utils_if_indextoname (ifindex, shandle->ifname)) {
shandle->ifindex = 0;
return -ENODEV;
}
shandle->fd = socket (PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (shandle->fd < 0) {
shandle->ifindex = 0;
return -errno;
}
shandle->ifindex = ifindex;
return 0;
}
static void
socket_handle_destroy (SocketHandle *shandle)
{
if (shandle->ifindex) {
shandle->ifindex = 0;
nm_close (shandle->fd);
}
}
#define nm_auto_socket_handle nm_auto(socket_handle_destroy)
/******************************************************************************
* ethtool
******************************************************************/
*****************************************************************************/
NM_UTILS_ENUM2STR_DEFINE_STATIC (_ethtool_cmd_to_string, guint32,
NM_UTILS_ENUM2STR (ETHTOOL_GDRVINFO, "ETHTOOL_GDRVINFO"),
@ -77,6 +116,7 @@ NM_UTILS_ENUM2STR_DEFINE_STATIC (_ethtool_cmd_to_string, guint32,
NM_UTILS_ENUM2STR (ETHTOOL_GSTATS, "ETHTOOL_GSTATS"),
NM_UTILS_ENUM2STR (ETHTOOL_GSTRINGS, "ETHTOOL_GSTRINGS"),
NM_UTILS_ENUM2STR (ETHTOOL_GWOL, "ETHTOOL_GWOL"),
NM_UTILS_ENUM2STR (ETHTOOL_SFEATURES, "ETHTOOL_SFEATURES"),
NM_UTILS_ENUM2STR (ETHTOOL_SSET, "ETHTOOL_SSET"),
NM_UTILS_ENUM2STR (ETHTOOL_SWOL, "ETHTOOL_SWOL"),
);
@ -87,6 +127,8 @@ _ethtool_data_to_string (gconstpointer edata, char *buf, gsize len)
return _ethtool_cmd_to_string (*((guint32 *) edata), buf, len);
}
/*****************************************************************************/
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
#define ethtool_cmd_speed(pedata) ((pedata)->speed)
@ -94,117 +136,553 @@ _ethtool_data_to_string (gconstpointer edata, char *buf, gsize len)
G_STMT_START { (pedata)->speed = (guint16) (speed); } G_STMT_END
#endif
static gboolean
ethtool_get (int ifindex, gpointer edata)
static int
ethtool_call_handle (SocketHandle *shandle, gpointer edata)
{
char ifname[IFNAMSIZ];
struct ifreq ifr = {
.ifr_data = edata,
};
char sbuf[50];
int errsv;
nm_assert (ifindex > 0);
nm_assert (shandle);
nm_assert (shandle->ifindex);
nm_assert (shandle->ifname[0]);
nm_assert (strlen (shandle->ifname) < IFNAMSIZ);
nm_assert (edata);
/* ethtool ioctl API uses the ifname to refer to an interface. That is racy
* as interfaces can be renamed *sigh*.
*
* Note that we anyway have to verify whether the interface exists, before
* calling ioctl for a non-existing ifname. This is to prevent autoloading
* of kernel modules *sigh*.
* Thus, as we anyway verify the existence of ifname before doing the call,
* go one step further and lookup the ifname everytime anew.
*
* This does not solve the renaming race, but it minimizes the time for
* the race to happen as much as possible. */
if (!nmp_utils_if_indextoname (ifindex, ifname)) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: request fails resolving ifindex: %s",
ifindex,
memcpy (ifr.ifr_name, shandle->ifname, IFNAMSIZ);
if (ioctl (shandle->fd, SIOCETHTOOL, &ifr) < 0) {
errsv = errno;
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s, %s: failed: %s",
shandle->ifindex,
_ethtool_data_to_string (edata, sbuf, sizeof (sbuf)),
g_strerror (errno));
return FALSE;
shandle->ifname,
strerror (errsv));
return -errsv;
}
{
nm_auto_close int fd = -1;
struct ifreq ifr = {
.ifr_data = edata,
};
memcpy (ifr.ifr_name, ifname, sizeof (ifname));
fd = socket (PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (fd < 0) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s, %s: failed creating socket for ioctl: %s",
ifindex,
_ethtool_data_to_string (edata, sbuf, sizeof (sbuf)),
ifname,
g_strerror (errno));
return FALSE;
}
if (ioctl (fd, SIOCETHTOOL, &ifr) < 0) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s, %s: failed: %s",
ifindex,
_ethtool_data_to_string (edata, sbuf, sizeof (sbuf)),
ifname,
strerror (errno));
return FALSE;
}
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s, %s: success",
ifindex,
_ethtool_data_to_string (edata, sbuf, sizeof (sbuf)),
ifname);
return TRUE;
}
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s, %s: success",
shandle->ifindex,
_ethtool_data_to_string (edata, sbuf, sizeof (sbuf)),
shandle->ifname);
return 0;
}
static int
ethtool_get_stringset_index (int ifindex, int stringset_id, const char *string)
ethtool_call_ifindex (int ifindex, gpointer edata)
{
gs_free struct ethtool_sset_info *info = NULL;
gs_free struct ethtool_gstrings *strings = NULL;
guint32 len, i;
nm_auto_socket_handle SocketHandle shandle = { };
int r;
char sbuf[50];
g_return_val_if_fail (ifindex > 0, -1);
nm_assert (edata);
info = g_malloc0 (sizeof (*info) + sizeof (guint32));
info->cmd = ETHTOOL_GSSET_INFO;
info->reserved = 0;
info->sset_mask = 1ULL << stringset_id;
if (!ethtool_get (ifindex, info))
return -1;
if (!info->sset_mask)
return -1;
len = info->data[0];
strings = g_malloc0 (sizeof (*strings) + len * ETH_GSTRING_LEN);
strings->cmd = ETHTOOL_GSTRINGS;
strings->string_set = stringset_id;
strings->len = len;
if (!ethtool_get (ifindex, strings))
return -1;
for (i = 0; i < len; i++) {
if (!strcmp ((char *) &strings->data[i * ETH_GSTRING_LEN], string))
return i;
if ((r = socket_handle_init (&shandle, ifindex)) < 0) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: failed creating ethtool socket: %s",
ifindex,
_ethtool_data_to_string (edata, sbuf, sizeof (sbuf)),
g_strerror (-r));
return r;
}
return ethtool_call_handle (&shandle, edata);
}
/*****************************************************************************/
static struct ethtool_gstrings *
ethtool_get_stringset (SocketHandle *shandle, int stringset_id)
{
struct {
struct ethtool_sset_info info;
guint32 sentinel;
} sset_info = { };
gs_free struct ethtool_gstrings *gstrings = NULL;
guint32 i, len;
sset_info.info.cmd = ETHTOOL_GSSET_INFO;
sset_info.info.reserved = 0;
sset_info.info.sset_mask = (1ULL << stringset_id);
if (ethtool_call_handle (shandle, &sset_info) < 0)
return NULL;
if (!sset_info.info.sset_mask)
return NULL;
len = sset_info.info.data[0];
gstrings = g_malloc0 (sizeof (*gstrings) + (len * ETH_GSTRING_LEN));
gstrings->cmd = ETHTOOL_GSTRINGS;
gstrings->string_set = stringset_id;
gstrings->len = len;
if (gstrings->len > 0) {
if (ethtool_call_handle (shandle, gstrings) < 0)
return NULL;
for (i = 0; i < gstrings->len; i++) {
/* ensure NUL terminated */
gstrings->data[i * ETH_GSTRING_LEN + (ETH_GSTRING_LEN - 1)] = '\0';
}
}
return g_steal_pointer (&gstrings);
}
static int
ethtool_gstrings_find (const struct ethtool_gstrings *gstrings, const char *needle)
{
guint32 i;
/* ethtool_get_stringset() always ensures NUL terminated strings at ETH_GSTRING_LEN.
* that means, we cannot possibly request longer names. */
nm_assert (needle && strlen (needle) < ETH_GSTRING_LEN);
for (i = 0; i < gstrings->len; i++) {
if (nm_streq ((char *) &gstrings->data[i * ETH_GSTRING_LEN], needle))
return i;
}
return -1;
}
static int
ethtool_get_stringset_index (SocketHandle *shandle, int stringset_id, const char *needle)
{
gs_free struct ethtool_gstrings *gstrings = NULL;
/* ethtool_get_stringset() always ensures NUL terminated strings at ETH_GSTRING_LEN.
* that means, we cannot possibly request longer names. */
nm_assert (needle && strlen (needle) < ETH_GSTRING_LEN);
gstrings = ethtool_get_stringset (shandle, stringset_id);
if (gstrings)
return ethtool_gstrings_find (gstrings, needle);
return -1;
}
/*****************************************************************************/
static const NMEthtoolFeatureInfo _ethtool_feature_infos[_NM_ETHTOOL_ID_FEATURE_NUM] = {
#define ETHT_FEAT(eid, ...) \
{ \
.ethtool_id = eid, \
.n_kernel_names = NM_NARG (__VA_ARGS__), \
.kernel_names = ((const char *const[]) { __VA_ARGS__ }), \
}
/* the order does only matter for one thing: if it happens that more than one NMEthtoolID
* reference the same kernel-name, then the one that is mentioned *later* will win in
* case these NMEthtoolIDs are set. That mostly only makes sense for ethtool-ids which
* refer to multiple features ("feature-tso"), while also having more specific ids
* ("feature-tx-tcp-segmentation"). */
/* names from ethtool utility, which are aliases for multiple features. */
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_SG, "tx-scatter-gather",
"tx-scatter-gather-fraglist"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TSO, "tx-tcp-segmentation",
"tx-tcp-ecn-segmentation",
"tx-tcp-mangleid-segmentation",
"tx-tcp6-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX, "tx-checksum-ipv4",
"tx-checksum-ip-generic",
"tx-checksum-ipv6",
"tx-checksum-fcoe-crc",
"tx-checksum-sctp"),
/* names from ethtool utility, which are aliases for one feature. */
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_GRO, "rx-gro"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_GSO, "tx-generic-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_LRO, "rx-lro"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_NTUPLE, "rx-ntuple-filter"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RX, "rx-checksum"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RXHASH, "rx-hashing"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RXVLAN, "rx-vlan-hw-parse"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TXVLAN, "tx-vlan-hw-insert"),
/* names of features, as known by kernel. */
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD, "esp-hw-offload"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, "esp-tx-csum-hw-offload"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_FCOE_MTU, "fcoe-mtu"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_HIGHDMA, "highdma"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, "hw-tc-offload"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, "l2-fwd-offload"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_LOOPBACK, "loopback"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RX_ALL, "rx-all"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RX_FCS, "rx-fcs"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, "rx-gro-hw"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, "rx-udp_tunnel-port-offload"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, "rx-vlan-filter"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, "rx-vlan-stag-filter"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, "rx-vlan-stag-hw-parse"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, "tls-hw-record"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, "tls-hw-tx-offload"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, "tx-checksum-fcoe-crc"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, "tx-checksum-ipv4"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, "tx-checksum-ipv6"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, "tx-checksum-ip-generic"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, "tx-checksum-sctp"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, "tx-esp-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, "tx-fcoe-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, "tx-gre-csum-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, "tx-gre-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, "tx-gso-partial"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, "tx-gso-robust"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, "tx-ipxip4-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, "tx-ipxip6-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, "tx-nocache-copy"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, "tx-scatter-gather"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, "tx-scatter-gather-fraglist"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, "tx-sctp-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, "tx-tcp6-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, "tx-tcp-ecn-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, "tx-tcp-mangleid-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, "tx-tcp-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, "tx-udp-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, "tx-udp_tnl-csum-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, "tx-udp_tnl-segmentation"),
ETHT_FEAT (NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, "tx-vlan-stag-hw-insert"),
};
/* the number of kernel features that we handle. It essentially is the sum of all
* kernel_names. So, all ethtool-ids that reference exactly one kernel-name
* (_NM_ETHTOOL_ID_FEATURE_NUM) + some extra, for ethtool-ids that are aliases
* for multiple kernel-names. */
#define N_ETHTOOL_KERNEL_FEATURES (((guint) _NM_ETHTOOL_ID_FEATURE_NUM) + 8u)
static void
_ASSERT_ethtool_feature_infos (void)
{
#if NM_MORE_ASSERTS > 10
guint i, k, n;
bool found[_NM_ETHTOOL_ID_FEATURE_NUM] = { };
G_STATIC_ASSERT_EXPR (G_N_ELEMENTS (_ethtool_feature_infos) == _NM_ETHTOOL_ID_FEATURE_NUM);
n = 0;
for (i = 0; i < G_N_ELEMENTS (_ethtool_feature_infos); i++) {
NMEthtoolFeatureState kstate;
const NMEthtoolFeatureInfo *inf = &_ethtool_feature_infos[i];
g_assert (inf->ethtool_id >= _NM_ETHTOOL_ID_FEATURE_FIRST);
g_assert (inf->ethtool_id <= _NM_ETHTOOL_ID_FEATURE_LAST);
g_assert (inf->n_kernel_names > 0);
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;
kstate.idx_kernel_name = inf->n_kernel_names - 1;
g_assert ((guint) kstate.idx_kernel_name == (guint) (inf->n_kernel_names - 1));
n += inf->n_kernel_names;
for (k = 0; k < inf->n_kernel_names; k++) {
g_assert (nm_utils_strv_find_first ((char **) inf->kernel_names,
k,
inf->kernel_names[k]) < 0);
}
}
for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++)
g_assert (found[i]);
g_assert (n == N_ETHTOOL_KERNEL_FEATURES);
#endif
}
static NMEthtoolFeatureStates *
ethtool_get_features (SocketHandle *shandle)
{
gs_free NMEthtoolFeatureStates *states = NULL;
gs_free struct ethtool_gstrings *ss_features = NULL;
_ASSERT_ethtool_feature_infos ();
ss_features = ethtool_get_stringset (shandle, ETH_SS_FEATURES);
if (!ss_features)
return NULL;
if (ss_features->len > 0) {
gs_free struct ethtool_gfeatures *gfeatures = NULL;
guint idx;
const NMEthtoolFeatureState *states_list0 = NULL;
const NMEthtoolFeatureState *const*states_plist0 = NULL;
guint states_plist_n = 0;
gfeatures = g_malloc0 ( sizeof (struct ethtool_gfeatures)
+ (NM_DIV_ROUND_UP (ss_features->len, 32u) * sizeof(gfeatures->features[0])));
gfeatures->cmd = ETHTOOL_GFEATURES;
gfeatures->size = NM_DIV_ROUND_UP (ss_features->len, 32u);
if (ethtool_call_handle (shandle, gfeatures) < 0)
return NULL;
for (idx = 0; idx < G_N_ELEMENTS (_ethtool_feature_infos); idx++) {
const NMEthtoolFeatureInfo *info = &_ethtool_feature_infos[idx];
guint idx_kernel_name;
for (idx_kernel_name = 0; idx_kernel_name < info->n_kernel_names; idx_kernel_name++) {
NMEthtoolFeatureState *kstate;
const char *kernel_name = info->kernel_names[idx_kernel_name];
int i_feature;
guint i_block;
guint32 i_flag;
i_feature = ethtool_gstrings_find (ss_features, kernel_name);
if (i_feature < 0)
continue;
i_block = ((guint) i_feature) / 32u;
i_flag = (guint32) (1u << (((guint) i_feature) % 32u));
if (!states) {
states = g_malloc0 (sizeof (NMEthtoolFeatureStates)
+ (N_ETHTOOL_KERNEL_FEATURES * sizeof (NMEthtoolFeatureState))
+ ((N_ETHTOOL_KERNEL_FEATURES + G_N_ELEMENTS (_ethtool_feature_infos)) * sizeof (NMEthtoolFeatureState *)));
states_list0 = &states->states_list[0];
states_plist0 = (gpointer) &states_list0[N_ETHTOOL_KERNEL_FEATURES];
states->n_ss_features = ss_features->len;
}
nm_assert (states->n_states < N_ETHTOOL_KERNEL_FEATURES);
kstate = (NMEthtoolFeatureState *) &states_list0[states->n_states];
states->n_states++;
kstate->info = info;
kstate->idx_ss_features = i_feature;
kstate->idx_kernel_name = idx_kernel_name;
kstate->available = !!(gfeatures->features[i_block].available & i_flag);
kstate->requested = !!(gfeatures->features[i_block].requested & i_flag);
kstate->active = !!(gfeatures->features[i_block].active & i_flag);
kstate->never_changed = !!(gfeatures->features[i_block].never_changed & i_flag);
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];
((const NMEthtoolFeatureState **) states_plist0)[states_plist_n] = kstate;
states_plist_n++;
}
if (states && states->states_indexed[info->ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST]) {
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++;
}
}
}
return g_steal_pointer (&states);
}
NMEthtoolFeatureStates *
nmp_utils_ethtool_get_features (int ifindex)
{
nm_auto_socket_handle SocketHandle shandle = { };
NMEthtoolFeatureStates *features;
int r;
g_return_val_if_fail (ifindex > 0, 0);
if ((r = socket_handle_init (&shandle, ifindex)) < 0) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: failed creating ethtool socket: %s",
ifindex,
"get-features",
g_strerror (-r));
return FALSE;
}
features = ethtool_get_features (&shandle);
if (!features) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: failure getting features",
ifindex,
"get-features");
return NULL;
}
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: retrieved kernel features",
ifindex,
"get-features");
return features;
}
static const char *
_ethtool_feature_state_to_string (char *buf, gsize buf_size, const NMEthtoolFeatureState *s, const char *prefix)
{
int l;
l = g_snprintf (buf, buf_size,
"%s %s%s",
prefix ?: "",
ONOFF (s->active),
(!s->available || s->never_changed)
? ", [fixed]"
: ((s->requested != s->active)
? (s->requested ? ", [requested on]" : ", [requested off]")
: ""));
nm_assert (l < buf_size);
return buf;
}
gboolean
nmp_utils_ethtool_set_features (int ifindex,
const NMEthtoolFeatureStates *features,
const NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */,
gboolean do_set /* or reset */)
{
nm_auto_socket_handle SocketHandle shandle = { };
gs_free struct ethtool_sfeatures *sfeatures = NULL;
int r;
guint i, j;
struct {
const NMEthtoolFeatureState *f_state;
NMTernary requested;
} set_states[N_ETHTOOL_KERNEL_FEATURES];
guint set_states_n = 0;
gboolean success = TRUE;
g_return_val_if_fail (ifindex > 0, 0);
g_return_val_if_fail (features, 0);
g_return_val_if_fail (requested, 0);
nm_assert (features->n_states <= N_ETHTOOL_KERNEL_FEATURES);
for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++) {
const NMEthtoolFeatureState *const*states_indexed;
if (requested[i] == NM_TERNARY_DEFAULT)
continue;
if (!(states_indexed = features->states_indexed[i])) {
if (do_set) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: set feature %s: skip (not found)",
ifindex,
"set-features",
nm_ethtool_data[i + _NM_ETHTOOL_ID_FEATURE_FIRST]->optname);
success = FALSE;
}
continue;
}
for (j = 0; states_indexed[j]; j++) {
const NMEthtoolFeatureState *s = states_indexed[j];
char sbuf[255];
if (set_states_n >= G_N_ELEMENTS (set_states))
g_return_val_if_reached (FALSE);
if (s->never_changed) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: %s feature %s (%s): %s, %s (skip feature marked as never changed)",
ifindex,
"set-features",
do_set ? "set" : "reset",
nm_ethtool_data[i + _NM_ETHTOOL_ID_FEATURE_FIRST]->optname,
s->info->kernel_names[s->idx_kernel_name],
ONOFF (do_set ? requested[i] == NM_TERNARY_TRUE : s->active),
_ethtool_feature_state_to_string (sbuf, sizeof (sbuf), s, do_set ? " currently:" : " before:"));
continue;
}
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: %s feature %s (%s): %s, %s",
ifindex,
"set-features",
do_set ? "set" : "reset",
nm_ethtool_data[i + _NM_ETHTOOL_ID_FEATURE_FIRST]->optname,
s->info->kernel_names[s->idx_kernel_name],
ONOFF (do_set ? requested[i] == NM_TERNARY_TRUE : s->active),
_ethtool_feature_state_to_string (sbuf, sizeof (sbuf), s, do_set ? " currently:" : " before:"));
if ( do_set
&& (!s->available || s->never_changed)
&& (s->active != (requested[i] == NM_TERNARY_TRUE))) {
/* we request to change a flag which kernel reported as fixed.
* While the ethtool operation will silently succeed, mark the request
* as failure. */
success = FALSE;
}
set_states[set_states_n].f_state = s;
set_states[set_states_n].requested = requested[i];
set_states_n++;
}
}
if (set_states_n == 0) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: no feature requested",
ifindex,
"set-features");
return TRUE;
}
if ((r = socket_handle_init (&shandle, ifindex)) < 0) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: failed creating ethtool socket: %s",
ifindex,
"set-features",
g_strerror (-r));
return FALSE;
}
sfeatures = g_malloc0 (sizeof (struct ethtool_sfeatures)
+ (NM_DIV_ROUND_UP (features->n_ss_features, 32U) * sizeof(sfeatures->features[0])));
sfeatures->cmd = ETHTOOL_SFEATURES;
sfeatures->size = NM_DIV_ROUND_UP (features->n_ss_features, 32U);
for (i = 0; i < set_states_n; i++) {
const NMEthtoolFeatureState *s = set_states[i].f_state;
guint i_block;
guint32 i_flag;
gboolean is_requested;
i_block = s->idx_ss_features / 32u;
i_flag = (guint32) (1u << (s->idx_ss_features % 32u));
sfeatures->features[i_block].valid |= i_flag;
if (do_set)
is_requested = (set_states[i].requested == NM_TERNARY_TRUE);
else
is_requested = s->active;
if (is_requested)
sfeatures->features[i_block].requested |= i_flag;
else
sfeatures->features[i_block].requested &= ~i_flag;
}
if ((r = ethtool_call_handle (&shandle, sfeatures)) < 0) {
success = FALSE;
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: failure setting features (%s)",
ifindex,
"set-features",
g_strerror (-r));
return FALSE;
}
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: %s",
ifindex,
"set-features",
success
? "successfully setting features"
: "at least some of the features were not successfuly set");
return success;
}
/*****************************************************************************/
gboolean
nmp_utils_ethtool_get_driver_info (int ifindex,
NMPUtilsEthtoolDriverInfo *data)
{
struct ethtool_drvinfo *drvinfo;
G_STATIC_ASSERT (sizeof (*data) == sizeof (*drvinfo));
G_STATIC_ASSERT (offsetof (NMPUtilsEthtoolDriverInfo, driver) == offsetof (struct ethtool_drvinfo, driver));
G_STATIC_ASSERT (offsetof (NMPUtilsEthtoolDriverInfo, version) == offsetof (struct ethtool_drvinfo, version));
G_STATIC_ASSERT (offsetof (NMPUtilsEthtoolDriverInfo, fw_version) == offsetof (struct ethtool_drvinfo, fw_version));
G_STATIC_ASSERT (sizeof (data->driver) == sizeof (drvinfo->driver));
G_STATIC_ASSERT (sizeof (data->version) == sizeof (drvinfo->version));
G_STATIC_ASSERT (sizeof (data->fw_version) == sizeof (drvinfo->fw_version));
G_STATIC_ASSERT_EXPR (sizeof (*data) == sizeof (*drvinfo));
G_STATIC_ASSERT_EXPR (offsetof (NMPUtilsEthtoolDriverInfo, driver) == offsetof (struct ethtool_drvinfo, driver));
G_STATIC_ASSERT_EXPR (offsetof (NMPUtilsEthtoolDriverInfo, version) == offsetof (struct ethtool_drvinfo, version));
G_STATIC_ASSERT_EXPR (offsetof (NMPUtilsEthtoolDriverInfo, fw_version) == offsetof (struct ethtool_drvinfo, fw_version));
G_STATIC_ASSERT_EXPR (sizeof (data->driver) == sizeof (drvinfo->driver));
G_STATIC_ASSERT_EXPR (sizeof (data->version) == sizeof (drvinfo->version));
G_STATIC_ASSERT_EXPR (sizeof (data->fw_version) == sizeof (drvinfo->fw_version));
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (data, FALSE);
@ -213,7 +691,7 @@ nmp_utils_ethtool_get_driver_info (int ifindex,
memset (drvinfo, 0, sizeof (*drvinfo));
drvinfo->cmd = ETHTOOL_GDRVINFO;
return ethtool_get (ifindex, drvinfo);
return ethtool_call_ifindex (ifindex, drvinfo) >= 0;
}
gboolean
@ -233,7 +711,7 @@ nmp_utils_ethtool_get_permanent_address (int ifindex,
edata.e.cmd = ETHTOOL_GPERMADDR;
edata.e.size = NM_UTILS_HWADDR_LEN_MAX;
if (!ethtool_get (ifindex, &edata.e))
if (ethtool_call_ifindex (ifindex, &edata.e) < 0)
return FALSE;
if (edata.e.size > NM_UTILS_HWADDR_LEN_MAX)
@ -252,8 +730,8 @@ nmp_utils_ethtool_get_permanent_address (int ifindex,
}
return FALSE;
}
not_all_0or1:
not_all_0or1:
memcpy (buf, edata.e.data, edata.e.size);
*length = edata.e.size;
return TRUE;
@ -270,20 +748,30 @@ nmp_utils_ethtool_supports_carrier_detect (int ifindex)
* assume the device supports carrier-detect, otherwise we assume it
* doesn't.
*/
return ethtool_get (ifindex, &edata);
return ethtool_call_ifindex (ifindex, &edata) >= 0;
}
gboolean
nmp_utils_ethtool_supports_vlans (int ifindex)
{
nm_auto_socket_handle SocketHandle shandle = { };
int r;
gs_free struct ethtool_gfeatures *features = NULL;
int idx, block, bit, size;
g_return_val_if_fail (ifindex > 0, FALSE);
idx = ethtool_get_stringset_index (ifindex, ETH_SS_FEATURES, "vlan-challenged");
if (idx == -1) {
nm_log_dbg (LOGD_PLATFORM, "ethtool: vlan-challenged ethtool feature does not exist for %d?", ifindex);
if ((r = socket_handle_init (&shandle, ifindex)) < 0) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: failed creating ethtool socket: %s",
ifindex,
"support-vlans",
g_strerror (-r));
return FALSE;
}
idx = ethtool_get_stringset_index (&shandle, ETH_SS_FEATURES, "vlan-challenged");
if (idx < 0) {
nm_log_dbg (LOGD_PLATFORM, "ethtool[%d]: vlan-challenged ethtool feature does not exist?", ifindex);
return FALSE;
}
@ -295,7 +783,7 @@ nmp_utils_ethtool_supports_vlans (int ifindex)
features->cmd = ETHTOOL_GFEATURES;
features->size = size;
if (!ethtool_get (ifindex, features))
if (ethtool_call_handle (&shandle, features) < 0)
return FALSE;
return !(features->features[block].active & (1 << bit));
@ -304,21 +792,32 @@ nmp_utils_ethtool_supports_vlans (int ifindex)
int
nmp_utils_ethtool_get_peer_ifindex (int ifindex)
{
nm_auto_socket_handle SocketHandle shandle = { };
int r;
gs_free struct ethtool_stats *stats = NULL;
int peer_ifindex_stat;
g_return_val_if_fail (ifindex > 0, 0);
peer_ifindex_stat = ethtool_get_stringset_index (ifindex, ETH_SS_STATS, "peer_ifindex");
if (peer_ifindex_stat == -1) {
nm_log_dbg (LOGD_PLATFORM, "ethtool: peer_ifindex stat for %d does not exist?", ifindex);
if ((r = socket_handle_init (&shandle, ifindex)) < 0) {
nm_log_trace (LOGD_PLATFORM, "ethtool[%d]: %s: failed creating ethtool socket: %s",
ifindex,
"get-peer-ifindex",
g_strerror (-r));
return FALSE;
}
peer_ifindex_stat = ethtool_get_stringset_index (&shandle, ETH_SS_STATS, "peer_ifindex");
if (peer_ifindex_stat < 0) {
nm_log_dbg (LOGD_PLATFORM, "ethtool[%d]: peer_ifindex stat does not exist?", ifindex);
return FALSE;
}
stats = g_malloc0 (sizeof (*stats) + (peer_ifindex_stat + 1) * sizeof (guint64));
stats->cmd = ETHTOOL_GSTATS;
stats->n_stats = peer_ifindex_stat + 1;
if (!ethtool_get (ifindex, stats))
if (ethtool_call_ifindex (ifindex, stats) < 0)
return 0;
return stats->data[peer_ifindex_stat];
@ -333,7 +832,7 @@ nmp_utils_ethtool_get_wake_on_lan (int ifindex)
memset (&wol, 0, sizeof (wol));
wol.cmd = ETHTOOL_GWOL;
if (!ethtool_get (ifindex, &wol))
if (ethtool_call_ifindex (ifindex, &wol) < 0)
return FALSE;
return wol.wolopts != 0;
@ -351,7 +850,7 @@ nmp_utils_ethtool_get_link_settings (int ifindex,
g_return_val_if_fail (ifindex > 0, FALSE);
if (!ethtool_get (ifindex, &edata))
if (ethtool_call_ifindex (ifindex, &edata) < 0)
return FALSE;
if (out_autoneg)
@ -433,7 +932,7 @@ nmp_utils_ethtool_set_link_settings (int ifindex,
|| (!speed && duplex == NM_PLATFORM_LINK_DUPLEX_UNKNOWN), FALSE);
/* retrieve first current settings */
if (!ethtool_get (ifindex, &edata))
if (ethtool_call_ifindex (ifindex, &edata) < 0)
return FALSE;
/* then change the needed ones */
@ -485,7 +984,7 @@ nmp_utils_ethtool_set_link_settings (int ifindex,
}
}
return ethtool_get (ifindex, &edata);
return ethtool_call_ifindex (ifindex, &edata) >= 0;
}
gboolean
@ -500,8 +999,8 @@ nmp_utils_ethtool_set_wake_on_lan (int ifindex,
if (wol == NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE)
return TRUE;
nm_log_dbg (LOGD_PLATFORM, "setting Wake-on-LAN options 0x%x, password '%s'",
(unsigned) wol, wol_password);
nm_log_dbg (LOGD_PLATFORM, "ethtool[%d]: setting Wake-on-LAN options 0x%x, password '%s'",
ifindex, (unsigned) wol, wol_password);
wol_info.cmd = ETHTOOL_SWOL;
wol_info.wolopts = 0;
@ -521,45 +1020,41 @@ nmp_utils_ethtool_set_wake_on_lan (int ifindex,
if (wol_password) {
if (!nm_utils_hwaddr_aton (wol_password, wol_info.sopass, ETH_ALEN)) {
nm_log_dbg (LOGD_PLATFORM, "couldn't parse Wake-on-LAN password '%s'", wol_password);
nm_log_dbg (LOGD_PLATFORM, "ethtool[%d]: couldn't parse Wake-on-LAN password '%s'", ifindex, wol_password);
return FALSE;
}
wol_info.wolopts |= WAKE_MAGICSECURE;
}
return ethtool_get (ifindex, &wol_info);
return ethtool_call_ifindex (ifindex, &wol_info) >= 0;
}
/******************************************************************
/******************************************************************************
* mii
******************************************************************/
*****************************************************************************/
gboolean
nmp_utils_mii_supports_carrier_detect (int ifindex)
{
char ifname[IFNAMSIZ];
nm_auto_close int fd = -1;
nm_auto_socket_handle SocketHandle shandle = { };
int r;
struct ifreq ifr;
struct mii_ioctl_data *mii;
g_return_val_if_fail (ifindex > 0, FALSE);
if (!nmp_utils_if_indextoname (ifindex, ifname)) {
nm_log_trace (LOGD_PLATFORM, "mii[%d]: carrier-detect no: request fails resolving ifindex: %s", ifindex, g_strerror (errno));
return FALSE;
}
fd = socket (PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (fd < 0) {
nm_log_trace (LOGD_PLATFORM, "mii[%d,%s]: carrier-detect no: couldn't open control socket: %s", ifindex, ifname, g_strerror (errno));
if ((r = socket_handle_init (&shandle, ifindex)) < 0) {
nm_log_trace (LOGD_PLATFORM, "mii[%d]: carrier-detect no: failed creating ethtool socket: %s",
ifindex,
g_strerror (-r));
return FALSE;
}
memset (&ifr, 0, sizeof (struct ifreq));
memcpy (ifr.ifr_name, ifname, IFNAMSIZ);
memcpy (ifr.ifr_name, shandle.ifname, IFNAMSIZ);
if (ioctl (fd, SIOCGMIIPHY, &ifr) < 0) {
nm_log_trace (LOGD_PLATFORM, "mii[%d,%s]: carrier-detect no: SIOCGMIIPHY failed: %s", ifindex, ifname, strerror (errno));
if (ioctl (shandle.fd, SIOCGMIIPHY, &ifr) < 0) {
nm_log_trace (LOGD_PLATFORM, "mii[%d,%s]: carrier-detect no: SIOCGMIIPHY failed: %s", ifindex, shandle.ifname, strerror (errno));
return FALSE;
}
@ -567,18 +1062,18 @@ nmp_utils_mii_supports_carrier_detect (int ifindex)
mii = (struct mii_ioctl_data *) &ifr.ifr_ifru;
mii->reg_num = MII_BMSR;
if (ioctl (fd, SIOCGMIIREG, &ifr) != 0) {
nm_log_trace (LOGD_PLATFORM, "mii[%d,%s]: carrier-detect no: SIOCGMIIREG failed: %s", ifindex, ifname, strerror (errno));
if (ioctl (shandle.fd, SIOCGMIIREG, &ifr) != 0) {
nm_log_trace (LOGD_PLATFORM, "mii[%d,%s]: carrier-detect no: SIOCGMIIREG failed: %s", ifindex, shandle.ifname, strerror (errno));
return FALSE;
}
nm_log_trace (LOGD_PLATFORM, "mii[%d,%s]: carrier-detect yes: SIOCGMIIREG result 0x%X", ifindex, ifname, mii->val_out);
nm_log_trace (LOGD_PLATFORM, "mii[%d,%s]: carrier-detect yes: SIOCGMIIREG result 0x%X", ifindex, shandle.ifname, mii->val_out);
return TRUE;
}
/******************************************************************
/******************************************************************************
* udev
******************************************************************/
*****************************************************************************/
const char *
nmp_utils_udev_get_driver (struct udev_device *udevice)

View file

@ -23,6 +23,9 @@
#include "nm-platform.h"
#include "nm-setting-wired.h"
#include "nm-ethtool-utils.h"
/*****************************************************************************/
const char *nmp_utils_ethtool_get_driver (int ifindex);
gboolean nmp_utils_ethtool_supports_carrier_detect (int ifindex);
@ -35,6 +38,10 @@ gboolean nmp_utils_ethtool_set_wake_on_lan (int ifindex, NMSettingWiredWakeOnLan
gboolean nmp_utils_ethtool_get_link_settings (int ifindex, gboolean *out_autoneg, guint32 *out_speed, NMPlatformLinkDuplexType *out_duplex);
gboolean nmp_utils_ethtool_set_link_settings (int ifindex, gboolean autoneg, guint32 speed, NMPlatformLinkDuplexType duplex);
gboolean nmp_utils_ethtool_get_permanent_address (int ifindex,
guint8 *buf,
size_t *length);
typedef struct {
/* We don't want to include <linux/ethtool.h> in header files,
* thus create a ABI compatible version of struct ethtool_drvinfo.*/
@ -55,9 +62,52 @@ typedef struct {
gboolean nmp_utils_ethtool_get_driver_info (int ifindex,
NMPUtilsEthtoolDriverInfo *data);
gboolean nmp_utils_ethtool_get_permanent_address (int ifindex,
guint8 *buf,
size_t *length);
typedef struct {
NMEthtoolID ethtool_id;
guint8 n_kernel_names;
/* one NMEthtoolID refers to one or more kernel_names. The reason for supporting this complexity
* (where one NMSettingEthtool option refers to multiple kernel features) is to follow what
* ethtool does, where "tx" is an alias for multiple features. */
const char *const*kernel_names;
} NMEthtoolFeatureInfo;
typedef struct {
const NMEthtoolFeatureInfo *info;
guint idx_ss_features;
/* one NMEthtoolFeatureInfo references one or more kernel_names. This is the index
* of the matching info->kernel_names */
guint8 idx_kernel_name;
bool available:1;
bool requested:1;
bool active:1;
bool never_changed:1;
} NMEthtoolFeatureState;
struct _NMEthtoolFeatureStates {
guint n_states;
guint n_ss_features;
/* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */
const NMEthtoolFeatureState *const*states_indexed[_NM_ETHTOOL_ID_FEATURE_NUM];
/* the same content, here as a list of n_states entries. */
const NMEthtoolFeatureState states_list[];
};
NMEthtoolFeatureStates *nmp_utils_ethtool_get_features (int ifindex);
gboolean nmp_utils_ethtool_set_features (int ifindex,
const NMEthtoolFeatureStates *features,
const NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */,
gboolean do_set /* or reset */);
/*****************************************************************************/
gboolean nmp_utils_mii_supports_carrier_detect (int ifindex);

View file

@ -3213,6 +3213,32 @@ NM_UTILS_LOOKUP_STR_DEFINE (nm_platform_link_duplex_type_to_string, NMPlatformLi
/*****************************************************************************/
NMEthtoolFeatureStates *
nm_platform_ethtool_get_link_features (NMPlatform *self, int ifindex)
{
_CHECK_SELF_NETNS (self, klass, netns, NULL);
g_return_val_if_fail (ifindex > 0, NULL);
return nmp_utils_ethtool_get_features (ifindex);
}
gboolean
nm_platform_ethtool_set_features (NMPlatform *self,
int ifindex,
const NMEthtoolFeatureStates *features,
const NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */,
gboolean do_set /* or reset */)
{
_CHECK_SELF_NETNS (self, klass, netns, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
return nmp_utils_ethtool_set_features (ifindex, features, requested, do_set);
}
/*****************************************************************************/
const NMDedupMultiHeadEntry *
nm_platform_lookup_all (NMPlatform *platform,
NMPCacheIdType cache_id_type,

View file

@ -1534,6 +1534,17 @@ int nm_platform_ip_address_cmp_expiry (const NMPlatformIPAddress *a, const NMPla
gboolean nm_platform_ethtool_set_wake_on_lan (NMPlatform *self, int ifindex, NMSettingWiredWakeOnLan wol, const char *wol_password);
gboolean nm_platform_ethtool_set_link_settings (NMPlatform *self, int ifindex, gboolean autoneg, guint32 speed, NMPlatformLinkDuplexType duplex);
gboolean nm_platform_ethtool_get_link_settings (NMPlatform *self, int ifindex, gboolean *out_autoneg, guint32 *out_speed, NMPlatformLinkDuplexType *out_duplex);
typedef struct _NMEthtoolFeatureStates NMEthtoolFeatureStates;
NMEthtoolFeatureStates *nm_platform_ethtool_get_link_features (NMPlatform *self,
int ifindex);
gboolean nm_platform_ethtool_set_features (NMPlatform *self,
int ifindex,
const NMEthtoolFeatureStates *features,
const NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */,
gboolean do_set /* or reset */);
const char * nm_platform_link_duplex_type_to_string (NMPlatformLinkDuplexType duplex);
void nm_platform_ip4_dev_route_blacklist_set (NMPlatform *self,

View file

@ -60,7 +60,7 @@ test_cleanup_internal (void)
g_assert (ifindex > 0);
/* wait for kernel to add the IPv6 link local address... it takes a bit. */
NMTST_WAIT_ASSERT (100, {
NMTST_WAIT_ASSERT (300, {
gs_unref_array GArray *addrs = NULL;
const NMPlatformIP6Address *a;

View file

@ -2713,6 +2713,102 @@ test_sysctl_netns_switch (void)
/*****************************************************************************/
static void
ethtool_features_dump (const NMEthtoolFeatureStates *features)
{
guint i, j;
g_assert (features);
_LOGT (">>> %u features (%u ss-features)", features->n_states, features->n_ss_features);
for (i = 0; i < features->n_states; i++) {
const NMEthtoolFeatureState *s = &features->states_list[i];
_LOGT (">>> feature-list[%3u]: %3d = %-32s (%3u) | %s %s %s %s",
i,
(int) s->info->ethtool_id,
s->info->kernel_names[s->idx_kernel_name],
s->idx_ss_features,
s->active ? "ACT" : "act",
s->available ? "AVA" : "ava",
s->never_changed ? "NCH" : "nch",
s->requested ? "REQ" : "req");
}
for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++) {
_LOGT (">>> feature-idx [%3u]: %-32s = %u features",
i + (guint) _NM_ETHTOOL_ID_FEATURE_FIRST,
nm_ethtool_data[i + _NM_ETHTOOL_ID_FEATURE_FIRST]->optname,
(guint) NM_PTRARRAY_LEN (features->states_indexed[i]));
for (j = 0; features->states_indexed[i] && features->states_indexed[i][j]; j++) {
const NMEthtoolFeatureState *s = features->states_indexed[i][j];
_LOGT (">>> %3u: %-32s | %s %s %s %s",
j,
s->info->kernel_names[s->idx_kernel_name],
s->active ? "ACT" : "act",
s->available ? "AVA" : "ava",
s->never_changed ? "NCH" : "nch",
s->requested ? "REQ" : "req");
}
}
}
static void
test_ethtool_features_get (void)
{
gs_unref_ptrarray GPtrArray *gfree_keeper = g_ptr_array_new_with_free_func (g_free);
const int IFINDEX = 1;
guint i;
guint i_run;
for (i_run = 0; i_run < 5; i_run++) {
NMEthtoolFeatureStates *features;
NMTernary *requested;
gboolean do_set = TRUE;
requested = g_new (NMTernary, _NM_ETHTOOL_ID_FEATURE_NUM);
for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++)
requested[i] = NM_TERNARY_DEFAULT;
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;
} 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;
} else if (i_run == 3)
do_set = FALSE;
_LOGT (">>> ethtool-features-get RUN %u (do-set=%s", i_run, do_set ? "set" : "reset");
features = nmp_utils_ethtool_get_features (IFINDEX);
g_ptr_array_add (gfree_keeper, features);
ethtool_features_dump (features);
if (_LOGT_ENABLED ()) {
int ignore;
ignore = system ("ethtool -k lo");
(void) ignore;
}
if (!do_set) {
requested = gfree_keeper->pdata[i_run * 2 - 2];
features = gfree_keeper->pdata[i_run * 2 - 1];
}
nmp_utils_ethtool_set_features (IFINDEX, features, requested, do_set);
}
}
/*****************************************************************************/
NMTstpSetupFunc const _nmtstp_setup_platform_func = SETUP;
void
@ -2774,5 +2870,7 @@ _nmtstp_setup_tests (void)
g_test_add_func ("/general/sysctl/rename", test_sysctl_rename);
g_test_add_func ("/general/sysctl/netns-switch", test_sysctl_netns_switch);
g_test_add_func ("/link/ethtool/features/get", test_ethtool_features_get);
}
}

View file

@ -41,6 +41,7 @@
#include "nm-setting-ip6-config.h"
#include "nm-setting-wired.h"
#include "nm-setting-wireless.h"
#include "nm-setting-ethtool.h"
#include "nm-setting-8021x.h"
#include "nm-setting-bond.h"
#include "nm-setting-team.h"
@ -53,6 +54,7 @@
#include "nm-setting-generic.h"
#include "nm-core-internal.h"
#include "nm-utils.h"
#include "nm-ethtool-utils.h"
#include "platform/nm-platform.h"
#include "NetworkManagerUtils.h"
@ -4045,200 +4047,254 @@ wireless_connection_from_ifcfg (const char *file,
return connection;
}
static void
parse_ethtool_option_autoneg (const char *value, gboolean *out_autoneg)
{
if (!value) {
PARSE_WARNING ("Auto-negotiation option missing");
return;
}
if (g_str_equal (value, "off"))
*out_autoneg = FALSE;
else if (g_str_equal (value, "on"))
*out_autoneg = TRUE;
else
PARSE_WARNING ("Auto-negotiation unknown value: %s", value);
}
static void
parse_ethtool_option_speed (const char *value, guint32 *out_speed)
{
if (!value) {
PARSE_WARNING ("Speed option missing");
return;
}
*out_speed = _nm_utils_ascii_str_to_int64 (value, 10, 0, G_MAXUINT32, 0);
if (errno)
PARSE_WARNING ("Speed value '%s' is invalid", value);
}
static void
parse_ethtool_option_duplex (const char *value, const char **out_duplex)
{
if (!value) {
PARSE_WARNING ("Duplex option missing");
return;
}
if (g_str_equal (value, "half"))
*out_duplex = "half";
else if (g_str_equal (value, "full"))
*out_duplex = "full";
else
PARSE_WARNING ("Duplex unknown value: %s", value);
}
static void
parse_ethtool_option_wol (const char *value, NMSettingWiredWakeOnLan *out_flags)
{
NMSettingWiredWakeOnLan wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_NONE;
if (!value) {
PARSE_WARNING ("Wake-on-LAN options missing");
return;
}
for (; *value; value++) {
switch (*value) {
case 'p':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_PHY;
break;
case 'u':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST;
break;
case 'm':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST;
break;
case 'b':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST;
break;
case 'a':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_ARP;
break;
case 'g':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC;
break;
case 's':
break;
case 'd':
wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_NONE;
break;
default:
PARSE_WARNING ("unrecognized Wake-on-LAN option '%c'", *value);
}
}
*out_flags = wol_flags;
}
static void parse_ethtool_option_sopass (const char *value, char **out_password)
{
if (!value) {
PARSE_WARNING ("Wake-on-LAN password missing");
return;
}
g_clear_pointer (out_password, g_free);
if (!nm_utils_hwaddr_valid (value, ETH_ALEN)) {
PARSE_WARNING ("Wake-on-LAN password '%s' is invalid", value);
return;
}
*out_password = g_strdup (value);
}
static void
parse_ethtool_option (const char *value,
NMSettingWiredWakeOnLan *out_flags,
char **out_password,
gboolean *out_autoneg,
guint32 *out_speed,
const char **out_duplex)
const char **out_duplex,
NMSettingEthtool **out_s_ethtool)
{
gs_free const char **words = NULL;
const char *const *iter;
const char *opt_val, *opt;
guint i;
words = nm_utils_strsplit_set (value, "\t ");
words = nm_utils_strsplit_set (value, NULL);
if (!words)
return;
iter = words;
if (words[0] && words[0][0] == '-') {
/* /sbin/ethtool $opts */
if (NM_IN_STRSET (words[0], "-K", "--features", "--offload")) {
if (!words[1]) {
/* first argument must be the interface name. This is invalid. */
return;
}
while (iter[0]) {
opt = iter++[0];
opt_val = iter[0];
if (!*out_s_ethtool)
*out_s_ethtool = NM_SETTING_ETHTOOL (nm_setting_ethtool_new ());
if (nm_streq (opt, "autoneg"))
parse_ethtool_option_autoneg (opt_val, out_autoneg);
else if (nm_streq (opt, "speed"))
parse_ethtool_option_speed (opt_val, out_speed);
else if (nm_streq (opt, "duplex"))
parse_ethtool_option_duplex (opt_val, out_duplex);
else if (nm_streq (opt, "wol"))
parse_ethtool_option_wol (opt_val, out_flags);
else if (nm_streq (opt, "sopass"))
parse_ethtool_option_sopass (opt_val, out_password);
else {
/* Silently skip unknown options */
for (i = 2; words[i]; ) {
const char *opt = words[i];
const char *opt_val = words[++i];
const NMEthtoolData *d = NULL;
NMTernary onoff = NM_TERNARY_DEFAULT;
if (nm_streq0 (opt_val, "on"))
onoff = NM_TERNARY_TRUE;
else if (nm_streq0 (opt_val, "off"))
onoff = NM_TERNARY_FALSE;
d = nms_ifcfg_rh_utils_get_ethtool_by_name (opt);
if (!d) {
if (onoff != NM_TERNARY_DEFAULT) {
/* the next value is just the on/off argument. Skip it too. */
i++;
}
/* silently ignore unsupported offloading features. */
continue;
}
i++;
if (onoff == NM_TERNARY_DEFAULT) {
PARSE_WARNING ("Expects on/off argument for feature '%s'", opt);
continue;
}
nm_setting_ethtool_set_feature (*out_s_ethtool,
d->optname,
onoff);
}
}
return;
}
/* /sbin/ethtool -s ${REALDEVICE} $opts */
for (i = 0; words[i]; ) {
const char *opt = words[i];
const char *opt_val = words[++i];
if (nm_streq (opt, "autoneg")) {
if (!opt_val) {
PARSE_WARNING ("Auto-negotiation option missing");
break;
}
i++;
if (nm_streq (opt_val, "off"))
*out_autoneg = FALSE;
else if (nm_streq (opt_val, "on"))
*out_autoneg = TRUE;
else
PARSE_WARNING ("Auto-negotiation unknown value: %s", opt_val);
continue;
}
if (iter[0])
iter++;
if (nm_streq (opt, "speed")) {
guint32 speed;
if (!opt_val) {
PARSE_WARNING ("Speed option missing");
break;
}
i++;
speed = _nm_utils_ascii_str_to_int64 (opt_val, 10, 0, G_MAXUINT32, 0);
if (errno == 0)
*out_speed = speed;
else
PARSE_WARNING ("Speed value '%s' is invalid", opt_val);
continue;
}
if (nm_streq (opt, "duplex")) {
if (!opt_val) {
PARSE_WARNING ("Duplex option missing");
break;
}
i++;
if (nm_streq (opt_val, "half"))
*out_duplex = "half";
else if (nm_streq (opt_val, "full"))
*out_duplex = "full";
else
PARSE_WARNING ("Duplex unknown value: %s", opt_val);
continue;
}
if (nm_streq (opt, "wol")) {
NMSettingWiredWakeOnLan wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_NONE;
if (!opt_val) {
PARSE_WARNING ("Wake-on-LAN options missing");
break;
}
i++;
for (; *opt_val; opt_val++) {
switch (*opt_val) {
case 'p':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_PHY;
break;
case 'u':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST;
break;
case 'm':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST;
break;
case 'b':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST;
break;
case 'a':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_ARP;
break;
case 'g':
wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC;
break;
case 's':
break;
case 'd':
wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_NONE;
break;
default:
PARSE_WARNING ("unrecognized Wake-on-LAN option '%c'", *opt_val);
}
}
*out_flags = wol_flags;
continue;
}
if (nm_streq (opt, "sopass")) {
if (!opt_val) {
PARSE_WARNING ("Wake-on-LAN password missing");
break;
}
i++;
if (nm_utils_hwaddr_valid (opt_val, ETH_ALEN)) {
g_clear_pointer (out_password, g_free);
*out_password = g_strdup (opt_val);
} else
PARSE_WARNING ("Wake-on-LAN password '%s' is invalid", opt_val);
continue;
}
/* Silently skip unknown options */
}
}
static void
parse_ethtool_options (shvarFile *ifcfg, NMSettingWired *s_wired, const char *value)
parse_ethtool_options (shvarFile *ifcfg, NMConnection *connection)
{
NMSettingWired *s_wired;
gs_unref_object NMSettingEthtool *s_ethtool = NULL;
NMSettingWiredWakeOnLan wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT;
gs_free char *wol_password = NULL, *wol_value = NULL;
gboolean ignore_wol_password = FALSE, autoneg = FALSE;
gs_free char *ethtool_opts_free = NULL;
const char *ethtool_opts;
gs_free char *wol_password = NULL;
gs_free char *wol_value_free = NULL;
const char *tmp;
gboolean autoneg = FALSE;
guint32 speed = 0;
const char *duplex = NULL;
if (value) {
gs_free const char **opts = NULL;
const char *const *iter;
ethtool_opts = svGetValue (ifcfg, "ETHTOOL_OPTS", &ethtool_opts_free);
if (ethtool_opts) {
/* WAKE_ON_LAN_IGNORE is inferred from a specified but empty ETHTOOL_OPTS */
if (!value[0])
if (!ethtool_opts[0])
wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE;
else {
gs_free const char **opts = NULL;
const char *const *iter;
opts = nm_utils_strsplit_set (value, ";");
for (iter = opts; iter && iter[0]; iter++) {
/* in case of repeated wol_passwords, parse_ethtool_option()
* will do the right thing and clear wol_password before resetting. */
parse_ethtool_option (iter[0], &wol_flags, &wol_password, &autoneg, &speed, &duplex);
opts = nm_utils_strsplit_set (ethtool_opts, ";");
for (iter = opts; iter && iter[0]; iter++) {
/* in case of repeated wol_passwords, parse_ethtool_option()
* will do the right thing and clear wol_password before resetting. */
parse_ethtool_option (iter[0],
&wol_flags,
&wol_password,
&autoneg,
&speed,
&duplex,
&s_ethtool);
}
}
}
/* ETHTOOL_WAKE_ON_LAN = ignore overrides WoL settings in ETHTOOL_OPTS */
wol_value = svGetValueStr_cp (ifcfg, "ETHTOOL_WAKE_ON_LAN");
if (wol_value) {
if (strcmp (wol_value, "ignore") == 0)
wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE;
else
PARSE_WARNING ("invalid ETHTOOL_WAKE_ON_LAN value '%s'", wol_value);
}
tmp = svGetValueStr (ifcfg, "ETHTOOL_WAKE_ON_LAN", &wol_value_free);
if (nm_streq0 (tmp, "ignore"))
wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE;
else if (tmp)
PARSE_WARNING ("invalid ETHTOOL_WAKE_ON_LAN value '%s'", tmp);
if ( wol_password
&& !NM_FLAGS_HAS (wol_flags, NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC)) {
PARSE_WARNING ("Wake-on-LAN password not expected");
ignore_wol_password = TRUE;
nm_clear_g_free (&wol_password);
}
g_object_set (s_wired,
NM_SETTING_WIRED_WAKE_ON_LAN, wol_flags,
NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD, ignore_wol_password ? NULL : wol_password,
NM_SETTING_WIRED_AUTO_NEGOTIATE, autoneg,
NM_SETTING_WIRED_SPEED, speed,
NM_SETTING_WIRED_DUPLEX, duplex,
NULL);
s_wired = nm_connection_get_setting_wired (connection);
if (s_wired) {
g_object_set (s_wired,
NM_SETTING_WIRED_WAKE_ON_LAN, wol_flags,
NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD, wol_password,
NM_SETTING_WIRED_AUTO_NEGOTIATE, autoneg,
NM_SETTING_WIRED_SPEED, speed,
NM_SETTING_WIRED_DUPLEX, duplex,
NULL);
}
if (s_ethtool) {
nm_connection_add_setting (connection,
NM_SETTING (g_steal_pointer (&s_ethtool)));
}
}
static NMSetting *
@ -4380,10 +4436,6 @@ make_wired_setting (shvarFile *ifcfg,
nm_clear_g_free (&value);
}
parse_ethtool_options (ifcfg, s_wired,
svGetValue (ifcfg, "ETHTOOL_OPTS", &value));
nm_clear_g_free (&value);
return (NMSetting *) g_steal_pointer (&s_wired);
}
@ -5610,6 +5662,8 @@ connection_from_file_full (const char *filename,
if (!connection)
return NULL;
parse_ethtool_options (parsed, connection);
has_complex_routes_v4 = utils_has_complex_routes (filename, AF_INET);
has_complex_routes_v6 = utils_has_complex_routes (filename, AF_INET6);

View file

@ -470,3 +470,104 @@ nms_ifcfg_rh_utils_user_key_decode (const char *name, GString *str_buffer)
return TRUE;
}
/*****************************************************************************/
const char *const _nm_ethtool_ifcfg_names[] = {
#define ETHT_NAME(eid, ename) \
[eid - _NM_ETHTOOL_ID_FEATURE_FIRST] = ""ename""
/* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD, "esp-hw-offload"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, "esp-tx-csum-hw-offload"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_FCOE_MTU, "fcoe-mtu"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_GRO, "gro"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_GSO, "gso"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_HIGHDMA, "highdma"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, "hw-tc-offload"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, "l2-fwd-offload"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_LOOPBACK, "loopback"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_LRO, "lro"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_NTUPLE, "ntuple"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RX, "rx"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RXHASH, "rxhash"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RXVLAN, "rxvlan"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RX_ALL, "rx-all"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RX_FCS, "rx-fcs"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, "rx-gro-hw"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, "rx-udp_tunnel-port-offload"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, "rx-vlan-filter"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, "rx-vlan-stag-filter"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, "rx-vlan-stag-hw-parse"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_SG, "sg"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, "tls-hw-record"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, "tls-hw-tx-offload"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TSO, "tso"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX, "tx"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TXVLAN, "txvlan"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, "tx-checksum-fcoe-crc"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, "tx-checksum-ipv4"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, "tx-checksum-ipv6"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, "tx-checksum-ip-generic"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, "tx-checksum-sctp"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, "tx-esp-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, "tx-fcoe-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, "tx-gre-csum-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, "tx-gre-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, "tx-gso-partial"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, "tx-gso-robust"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, "tx-ipxip4-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, "tx-ipxip6-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, "tx-nocache-copy"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, "tx-scatter-gather"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, "tx-scatter-gather-fraglist"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, "tx-sctp-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, "tx-tcp6-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, "tx-tcp-ecn-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, "tx-tcp-mangleid-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, "tx-tcp-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, "tx-udp-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, "tx-udp_tnl-csum-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, "tx-udp_tnl-segmentation"),
ETHT_NAME (NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, "tx-vlan-stag-hw-insert"),
};
const NMEthtoolData *
nms_ifcfg_rh_utils_get_ethtool_by_name (const char *name)
{
static const struct {
NMEthtoolID ethtool_id;
const char *kernel_name;
} kernel_names[] = {
{ NM_ETHTOOL_ID_FEATURE_GRO, "rx-gro" },
{ NM_ETHTOOL_ID_FEATURE_GSO, "tx-generic-segmentation" },
{ NM_ETHTOOL_ID_FEATURE_LRO, "rx-lro" },
{ NM_ETHTOOL_ID_FEATURE_NTUPLE, "rx-ntuple-filter" },
{ NM_ETHTOOL_ID_FEATURE_RX, "rx-checksum" },
{ NM_ETHTOOL_ID_FEATURE_RXHASH, "rx-hashing" },
{ NM_ETHTOOL_ID_FEATURE_RXVLAN, "rx-vlan-hw-parse" },
{ NM_ETHTOOL_ID_FEATURE_TXVLAN, "tx-vlan-hw-insert" },
};
guint i;
for (i = 0; i < G_N_ELEMENTS (_nm_ethtool_ifcfg_names); i++) {
if (nm_streq (name, _nm_ethtool_ifcfg_names[i]))
return nm_ethtool_data[i];
}
/* Option not found. Note that ethtool utility has built-in features and
* NetworkManager's API follows the naming of these built-in features, whenever
* they exist.
* For example, NM's "ethtool.feature-ntuple" corresponds to ethtool utility's "ntuple"
* feature. However the underlying kernel feature is called "rx-ntuple-filter" (as reported
* for ETH_SS_FEATURES).
*
* With ethtool utility, whose command line we attempt to parse here, the user can also
* specify the name of the underlying kernel feature directly. So, check whether that is
* the case and if yes, map them to the corresponding NetworkManager's features. */
for (i = 0; i < G_N_ELEMENTS (kernel_names); i++) {
if (nm_streq (name, kernel_names[i].kernel_name))
return nm_ethtool_data[kernel_names[i].ethtool_id];
}
return NULL;
}

View file

@ -22,6 +22,7 @@
#define _UTILS_H_
#include "nm-connection.h"
#include "nm-ethtool-utils.h"
#include "shvar.h"
@ -80,4 +81,20 @@ _nms_ifcfg_rh_utils_numbered_tag (char *buf, gsize buf_len, const char *tag_name
_nms_ifcfg_rh_utils_numbered_tag (buf, sizeof (buf), ""tag_name"", (which)); \
})
/*****************************************************************************/
extern const char *const _nm_ethtool_ifcfg_names[_NM_ETHTOOL_ID_FEATURE_NUM];
static inline const char *
nms_ifcfg_rh_utils_get_ethtool_name (NMEthtoolID ethtool_id)
{
nm_assert (ethtool_id >= _NM_ETHTOOL_ID_FEATURE_FIRST && ethtool_id <= _NM_ETHTOOL_ID_FEATURE_LAST);
nm_assert ((ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST) < G_N_ELEMENTS (_nm_ethtool_ifcfg_names));
nm_assert (_nm_ethtool_ifcfg_names[ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST]);
return _nm_ethtool_ifcfg_names[ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST];
}
const NMEthtoolData *nms_ifcfg_rh_utils_get_ethtool_by_name (const char *name);
#endif /* _UTILS_H_ */

View file

@ -37,6 +37,7 @@
#include "nm-setting-connection.h"
#include "nm-setting-wired.h"
#include "nm-setting-wireless.h"
#include "nm-setting-ethtool.h"
#include "nm-setting-8021x.h"
#include "nm-setting-proxy.h"
#include "nm-setting-ip4-config.h"
@ -50,6 +51,7 @@
#include "nm-core-internal.h"
#include "NetworkManagerUtils.h"
#include "nm-meta-setting.h"
#include "nm-ethtool-utils.h"
#include "nms-ifcfg-rh-common.h"
#include "nms-ifcfg-rh-reader.h"
@ -809,7 +811,7 @@ write_wireless_setting (NMConnection *connection,
const char *device_mac, *cloned_mac;
guint32 mtu, chan, i;
gboolean adhoc = FALSE, hex_ssid = FALSE;
const char * const *macaddr_blacklist;
const char *const*macaddr_blacklist;
s_wireless = nm_connection_get_setting_wireless (connection);
if (!s_wireless) {
@ -1041,16 +1043,9 @@ static gboolean
write_wired_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
{
NMSettingWired *s_wired;
const char *device_mac, *cloned_mac;
char *tmp;
const char *nettype, *portname, *ctcprot, *s390_key, *s390_val, *duplex;
guint32 mtu, num_opts, speed, i;
const char *const *s390_subchannels;
GString *str = NULL;
const char * const *macaddr_blacklist;
gboolean auto_negotiate;
NMSettingWiredWakeOnLan wol;
const char *wol_password;
const char *const*s390_subchannels;
guint32 mtu, num_opts, i;
const char *const*macaddr_blacklist;
s_wired = nm_connection_get_setting_wired (connection);
if (!s_wired) {
@ -1059,144 +1054,211 @@ write_wired_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
return FALSE;
}
device_mac = nm_setting_wired_get_mac_address (s_wired);
svSetValueStr (ifcfg, "HWADDR", device_mac);
svSetValueStr (ifcfg, "HWADDR",
nm_setting_wired_get_mac_address (s_wired));
cloned_mac = nm_setting_wired_get_cloned_mac_address (s_wired);
svSetValueStr (ifcfg, "MACADDR", cloned_mac);
svSetValueStr (ifcfg, "MACADDR",
nm_setting_wired_get_cloned_mac_address (s_wired));
svSetValueStr (ifcfg, "GENERATE_MAC_ADDRESS_MASK",
nm_setting_wired_get_generate_mac_address_mask (s_wired));
svUnsetValue (ifcfg, "HWADDR_BLACKLIST");
macaddr_blacklist = nm_setting_wired_get_mac_address_blacklist (s_wired);
if (macaddr_blacklist[0]) {
char *blacklist_str;
gs_free char *blacklist_str = NULL;
blacklist_str = g_strjoinv (" ", (char **) macaddr_blacklist);
svSetValueStr (ifcfg, "HWADDR_BLACKLIST", blacklist_str);
g_free (blacklist_str);
}
} else
svUnsetValue (ifcfg, "HWADDR_BLACKLIST");
mtu = nm_setting_wired_get_mtu (s_wired);
svSetValueInt64_cond (ifcfg, "MTU", mtu != 0, mtu);
svUnsetValue (ifcfg, "SUBCHANNELS");
s390_subchannels = nm_setting_wired_get_s390_subchannels (s_wired);
if (s390_subchannels) {
int len = g_strv_length ((char **)s390_subchannels);
tmp = NULL;
{
gs_free char *tmp = NULL;
gsize len = NM_PTRARRAY_LEN (s390_subchannels);
if (len == 2) {
tmp = g_strdup_printf ("%s,%s", s390_subchannels[0], s390_subchannels[1]);
tmp = g_strdup_printf ("%s,%s",
s390_subchannels[0],
s390_subchannels[1]);
} else if (len == 3) {
tmp = g_strdup_printf ("%s,%s,%s", s390_subchannels[0], s390_subchannels[1],
tmp = g_strdup_printf ("%s,%s,%s",
s390_subchannels[0],
s390_subchannels[1],
s390_subchannels[2]);
}
svSetValueStr (ifcfg, "SUBCHANNELS", tmp);
g_free (tmp);
}
svUnsetValue (ifcfg, "NETTYPE");
nettype = nm_setting_wired_get_s390_nettype (s_wired);
if (nettype)
svSetValueStr (ifcfg, "NETTYPE", nettype);
svSetValueStr (ifcfg, "NETTYPE",
nm_setting_wired_get_s390_nettype (s_wired));
svUnsetValue (ifcfg, "PORTNAME");
portname = nm_setting_wired_get_s390_option_by_key (s_wired, "portname");
if (portname)
svSetValueStr (ifcfg, "PORTNAME", portname);
svSetValueStr (ifcfg, "PORTNAME",
nm_setting_wired_get_s390_option_by_key (s_wired, "portname"));
svUnsetValue (ifcfg, "CTCPROT");
ctcprot = nm_setting_wired_get_s390_option_by_key (s_wired, "ctcprot");
if (ctcprot)
svSetValueStr (ifcfg, "CTCPROT", ctcprot);
svSetValueStr (ifcfg, "CTCPROT",
nm_setting_wired_get_s390_option_by_key (s_wired, "ctcprot"));
svUnsetValue (ifcfg, "OPTIONS");
num_opts = nm_setting_wired_get_num_s390_options (s_wired);
if (s390_subchannels && num_opts) {
str = g_string_sized_new (30);
nm_auto_free_gstring GString *tmp = NULL;
for (i = 0; i < num_opts; i++) {
const char *s390_key, *s390_val;
nm_setting_wired_get_s390_option (s_wired, i, &s390_key, &s390_val);
/* portname is handled separately */
if (!strcmp (s390_key, "portname") || !strcmp (s390_key, "ctcprot"))
continue;
if (str->len)
g_string_append_c (str, ' ');
g_string_append_printf (str, "%s=%s", s390_key, s390_val);
if (!tmp)
tmp = g_string_sized_new (30);
else
g_string_append_c (tmp, ' ');
g_string_append_printf (tmp, "%s=%s", s390_key, s390_val);
}
if (str->len)
svSetValueStr (ifcfg, "OPTIONS", str->str);
g_string_free (str, TRUE);
if (tmp)
svSetValueStr (ifcfg, "OPTIONS", tmp->str);
}
/* Stuff ETHTOOL_OPT with required options */
str = NULL;
auto_negotiate = nm_setting_wired_get_auto_negotiate (s_wired);
speed = nm_setting_wired_get_speed (s_wired);
duplex = nm_setting_wired_get_duplex (s_wired);
svSetValueStr (ifcfg, "TYPE", TYPE_ETHERNET);
/* autoneg off + speed 0 + duplex NULL, means we want NM
* to skip link configuration which is default. So write
* down link config only if we have auto-negotiate true or
* a valid value for one among speed and duplex.
*/
if (auto_negotiate) {
str = g_string_sized_new (64);
g_string_printf (str, "autoneg on");
} else if (speed || duplex) {
str = g_string_sized_new (64);
g_string_printf (str, "autoneg off");
return TRUE;
}
static gboolean
write_ethtool_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
{
NMSettingWired *s_wired;
NMSettingEthtool *s_ethtool;
const char *duplex;
guint32 speed;
GString *str = NULL;
gboolean auto_negotiate;
NMSettingWiredWakeOnLan wol;
const char *wol_password;
s_wired = nm_connection_get_setting_wired (connection);
s_ethtool = NM_SETTING_ETHTOOL (nm_connection_get_setting (connection, NM_TYPE_SETTING_ETHTOOL));
if (!s_wired && !s_ethtool) {
svUnsetValue (ifcfg, "ETHTOOL_WAKE_ON_LAN");
svUnsetValue (ifcfg, "ETHTOOL_OPTS");
return TRUE;
}
if (speed)
g_string_append_printf (str, " speed %u", speed);
if (duplex)
g_string_append_printf (str, " duplex %s", duplex);
wol = nm_setting_wired_get_wake_on_lan (s_wired);
wol_password = nm_setting_wired_get_wake_on_lan_password (s_wired);
if (s_wired) {
auto_negotiate = nm_setting_wired_get_auto_negotiate (s_wired);
speed = nm_setting_wired_get_speed (s_wired);
duplex = nm_setting_wired_get_duplex (s_wired);
/* autoneg off + speed 0 + duplex NULL, means we want NM
* to skip link configuration which is default. So write
* down link config only if we have auto-negotiate true or
* a valid value for one among speed and duplex.
*/
if (auto_negotiate) {
str = g_string_sized_new (64);
g_string_printf (str, "autoneg on");
} else if (speed || duplex) {
str = g_string_sized_new (64);
g_string_printf (str, "autoneg off");
}
if (speed)
g_string_append_printf (str, " speed %u", speed);
if (duplex)
g_string_append_printf (str, " duplex %s", duplex);
wol = nm_setting_wired_get_wake_on_lan (s_wired);
wol_password = nm_setting_wired_get_wake_on_lan_password (s_wired);
svSetValue (ifcfg, "ETHTOOL_WAKE_ON_LAN",
wol == NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE
? "ignore"
: NULL);
if (!NM_IN_SET (wol, NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE,
NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT)) {
if (!str)
str = g_string_sized_new (30);
else
g_string_append (str, " ");
g_string_append (str, "wol ");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_PHY))
g_string_append (str, "p");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST))
g_string_append (str, "u");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST))
g_string_append (str, "m");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST))
g_string_append (str, "b");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_ARP))
g_string_append (str, "a");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC))
g_string_append (str, "g");
if (!NM_FLAGS_ANY (wol, NM_SETTING_WIRED_WAKE_ON_LAN_ALL))
g_string_append (str, "d");
if (wol_password && NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC))
g_string_append_printf (str, "s sopass %s", wol_password);
}
} else
svUnsetValue (ifcfg, "ETHTOOL_WAKE_ON_LAN");
if (s_ethtool) {
NMEthtoolID ethtool_id;
NMSettingConnection *s_con;
const char *iface = NULL;
s_con = nm_connection_get_setting_connection (connection);
if (s_con) {
iface = nm_setting_connection_get_interface_name (s_con);
if ( iface
&& ( !iface[0]
|| !NM_STRCHAR_ALL (iface, ch, (ch >= 'a' && ch <= 'z')
|| (ch >= 'A' && ch <= 'Z')
|| (ch >= '0' && ch <= '9')
|| NM_IN_SET (ch, '_'))))
iface = NULL;
}
if (wol == NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE)
svSetValue (ifcfg, "ETHTOOL_WAKE_ON_LAN", "ignore");
else if (wol == NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT) {
if (!str)
svUnsetValue (ifcfg, "ETHTOOL_OPTS");
} else {
if (!str)
str = g_string_sized_new (30);
else
g_string_append (str, " ");
g_string_append (str, " ; ");
g_string_append (str, "-K ");
g_string_append (str, iface ?: "net0");
g_string_append (str, "wol ");
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;
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_PHY))
g_string_append (str, "p");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST))
g_string_append (str, "u");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST))
g_string_append (str, "m");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST))
g_string_append (str, "b");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_ARP))
g_string_append (str, "a");
if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC))
g_string_append (str, "g");
nm_assert (nms_ifcfg_rh_utils_get_ethtool_name (ethtool_id));
if (!NM_FLAGS_ANY (wol, NM_SETTING_WIRED_WAKE_ON_LAN_ALL))
g_string_append (str, "d");
val = nm_setting_ethtool_get_feature (s_ethtool, ed->optname);
if (val == NM_TERNARY_DEFAULT)
continue;
if (wol_password && NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC))
g_string_append_printf (str, "s sopass %s", wol_password);
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");
}
}
if (str) {
svSetValueStr (ifcfg, "ETHTOOL_OPTS", str->str);
g_string_free (str, TRUE);
}
/* End ETHTOOL_OPT stuffing */
svSetValueStr (ifcfg, "TYPE", TYPE_ETHERNET);
} else
svUnsetValue (ifcfg, "ETHTOOL_OPTS");
return TRUE;
}
@ -2962,6 +3024,9 @@ do_write_construct (NMConnection *connection,
if (!write_proxy_setting (connection, ifcfg, error))
return FALSE;
if (!write_ethtool_setting (connection, ifcfg, error))
return FALSE;
if (!write_user_setting (connection, ifcfg, error))
return FALSE;

View file

@ -1,7 +1,7 @@
ETHTOOL_OPTS="autoneg off speed 10 duplex half"
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
ETHTOOL_OPTS="autoneg off speed 10 duplex half"
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no

View file

@ -1,7 +1,7 @@
ETHTOOL_OPTS="wol umgs sopass 00:00:00:11:22:33"
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
ETHTOOL_OPTS="wol umgs sopass 00:00:00:11:22:33"
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no

View file

@ -0,0 +1,15 @@
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
ETHTOOL_OPTS="autoneg on ; -K net0 rxvlan off tx on"
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME="Test Write Wired Auto-Negotiate"
UUID=${UUID}
ONBOOT=yes

View file

@ -43,12 +43,14 @@
#include "nm-setting-pppoe.h"
#include "nm-setting-ppp.h"
#include "nm-setting-vpn.h"
#include "nm-setting-ethtool.h"
#include "nm-setting-gsm.h"
#include "nm-setting-cdma.h"
#include "nm-setting-serial.h"
#include "nm-setting-vlan.h"
#include "nm-setting-dcb.h"
#include "nm-core-internal.h"
#include "nm-ethtool-utils.h"
#include "NetworkManagerUtils.h"
@ -185,7 +187,8 @@ _assert_expected_content (NMConnection *connection, const char *filename, const
if ( len_expectd != len_written
|| memcmp (content_expectd, content_written, len_expectd) != 0) {
if (g_getenv ("NMTST_IFCFG_RH_UPDATE_EXPECTED")) {
if ( g_getenv ("NMTST_IFCFG_RH_UPDATE_EXPECTED")
|| nm_streq0 (g_getenv ("NM_TEST_REGENERATE"), "1")) {
if (uuid) {
gs_free char *search = g_strdup_printf ("UUID=%s\n", uuid);
const char *s;
@ -3725,6 +3728,7 @@ test_write_wired_auto_negotiate_on (void)
gs_unref_object NMConnection *connection = NULL;
gs_unref_object NMConnection *reread = NULL;
NMSettingWired *s_wired;
NMSettingEthtool *s_ethtool;
char *val;
shvarFile *f;
@ -3734,8 +3738,14 @@ test_write_wired_auto_negotiate_on (void)
NM_SETTING_WIRED_AUTO_NEGOTIATE, TRUE,
NULL);
_writer_new_connection (connection,
s_ethtool = NM_SETTING_ETHTOOL (nm_setting_ethtool_new ());
nm_setting_ethtool_set_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_TX, NM_TERNARY_TRUE);
nm_setting_ethtool_set_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN, NM_TERNARY_FALSE);
nm_connection_add_setting (connection, NM_SETTING (s_ethtool));
_writer_new_connec_exp (connection,
TEST_SCRATCH_DIR,
TEST_IFCFG_DIR"/ifcfg-test_write_wired_auto_negotiate_on.cexpected",
&testfile);
f = _svOpenFile (testfile);
@ -3749,7 +3759,15 @@ test_write_wired_auto_negotiate_on (void)
reread = _connection_from_file (testfile, NULL, TYPE_ETHERNET, NULL);
nmtst_assert_connection_verifies_without_normalization (reread);
nmtst_assert_connection_equals (connection, TRUE, reread, FALSE);
s_ethtool = NM_SETTING_ETHTOOL (nm_connection_get_setting (reread, NM_TYPE_SETTING_ETHTOOL));
g_assert (s_ethtool);
g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_TX), ==, NM_TERNARY_TRUE);
g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN), ==, NM_TERNARY_FALSE);
g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN), ==, NM_TERNARY_DEFAULT);
}
static void