diff options
| author | Michael Biebl <biebl@debian.org> | 2026-05-14 19:21:22 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2026-05-14 19:21:22 +0200 |
| commit | 869e9027026cdbb15d4e4a6327ff41d2697858eb (patch) | |
| tree | 52edec7f935ff1bbb425c3515c6e49e6b8b0e28b /src/libnm-core-impl | |
| parent | 067fb576988f685e83ac8b0ae690334aff547c85 (diff) | |
New upstream version 1.56.1 upstream/1.56.1
Diffstat (limited to 'src/libnm-core-impl')
| -rw-r--r-- | src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in | 28 | ||||
| -rw-r--r-- | src/libnm-core-impl/meson.build | 1 | ||||
| -rw-r--r-- | src/libnm-core-impl/nm-connection.c | 17 | ||||
| -rw-r--r-- | src/libnm-core-impl/nm-meta-setting-base-impl.c | 9 | ||||
| -rw-r--r-- | src/libnm-core-impl/nm-setting-bridge.c | 14 | ||||
| -rw-r--r-- | src/libnm-core-impl/nm-setting-geneve.c | 354 | ||||
| -rw-r--r-- | src/libnm-core-impl/nm-setting-ip-config.c | 3 | ||||
| -rw-r--r-- | src/libnm-core-impl/nm-setting.c | 2 |
8 files changed, 420 insertions, 8 deletions
diff --git a/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in b/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in index c83deea9..8d5d3bc9 100644 --- a/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in +++ b/src/libnm-core-impl/gen-metadata-nm-settings-libnm-core.xml.in @@ -1378,6 +1378,34 @@ gprop-type="gchararray" /> </setting> + <setting name="geneve" + gtype="NMSettingGeneve" + > + <property name="destination-port" + dbus-type="u" + gprop-type="guint" + /> + <property name="df" + dbus-type="i" + gprop-type="gint" + /> + <property name="id" + dbus-type="u" + gprop-type="guint" + /> + <property name="remote" + dbus-type="s" + gprop-type="gchararray" + /> + <property name="tos" + dbus-type="u" + gprop-type="guint" + /> + <property name="ttl" + dbus-type="i" + gprop-type="gint" + /> + </setting> <setting name="gsm" gtype="NMSettingGsm" > diff --git a/src/libnm-core-impl/meson.build b/src/libnm-core-impl/meson.build index 610e2279..1eee3184 100644 --- a/src/libnm-core-impl/meson.build +++ b/src/libnm-core-impl/meson.build @@ -17,6 +17,7 @@ libnm_core_settings_sources = files( 'nm-setting-dummy.c', 'nm-setting-ethtool.c', 'nm-setting-generic.c', + 'nm-setting-geneve.c', 'nm-setting-gsm.c', 'nm-setting-hostname.c', 'nm-setting-hsr.c', diff --git a/src/libnm-core-impl/nm-connection.c b/src/libnm-core-impl/nm-connection.c index 0fbadfb8..180fcbbc 100644 --- a/src/libnm-core-impl/nm-connection.c +++ b/src/libnm-core-impl/nm-connection.c @@ -3272,6 +3272,7 @@ nm_connection_is_virtual(NMConnection *connection) NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BRIDGE_SETTING_NAME, NM_SETTING_DUMMY_SETTING_NAME, + NM_SETTING_GENEVE_SETTING_NAME, NM_SETTING_HSR_SETTING_NAME, NM_SETTING_IP_TUNNEL_SETTING_NAME, NM_SETTING_IPVLAN_SETTING_NAME, @@ -3527,6 +3528,22 @@ nm_connection_get_setting_generic(NMConnection *connection) } /** + * nm_connection_get_setting_geneve: + * @connection: the #NMConnection + * + * A shortcut to return any #NMSettingGeneve the connection might contain. + * + * Returns: (transfer none): an #NMSettingGeneve if the connection contains one, otherwise NULL + * + * Since: 1.58, 1.56.1 + **/ +NMSettingGeneve * +nm_connection_get_setting_geneve(NMConnection *connection) +{ + return _nm_connection_get_setting_by_metatype(connection, NM_META_SETTING_TYPE_GENEVE); +} + +/** * nm_connection_get_setting_gsm: * @connection: the #NMConnection * diff --git a/src/libnm-core-impl/nm-meta-setting-base-impl.c b/src/libnm-core-impl/nm-meta-setting-base-impl.c index 52af9ad2..d84490d2 100644 --- a/src/libnm-core-impl/nm-meta-setting-base-impl.c +++ b/src/libnm-core-impl/nm-meta-setting-base-impl.c @@ -27,6 +27,7 @@ #include "nm-setting-dummy.h" #include "nm-setting-ethtool.h" #include "nm-setting-generic.h" +#include "nm-setting-geneve.h" #include "nm-setting-gsm.h" #include "nm-setting-hostname.h" #include "nm-setting-hsr.h" @@ -324,6 +325,13 @@ const NMMetaSettingInfo nm_meta_setting_infos[] = { .setting_name = NM_SETTING_GENERIC_SETTING_NAME, .get_setting_gtype = nm_setting_generic_get_type, }, + [NM_META_SETTING_TYPE_GENEVE] = + { + .meta_type = NM_META_SETTING_TYPE_GENEVE, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, + .setting_name = NM_SETTING_GENEVE_SETTING_NAME, + .get_setting_gtype = nm_setting_geneve_get_type, + }, [NM_META_SETTING_TYPE_GSM] = { .meta_type = NM_META_SETTING_TYPE_GSM, @@ -655,6 +663,7 @@ const NMMetaSettingType nm_meta_setting_types_by_priority[] = { NM_META_SETTING_TYPE_CDMA, NM_META_SETTING_TYPE_DUMMY, NM_META_SETTING_TYPE_GENERIC, + NM_META_SETTING_TYPE_GENEVE, NM_META_SETTING_TYPE_GSM, NM_META_SETTING_TYPE_HSR, NM_META_SETTING_TYPE_INFINIBAND, diff --git a/src/libnm-core-impl/nm-setting-bridge.c b/src/libnm-core-impl/nm-setting-bridge.c index c1618434..21457412 100644 --- a/src/libnm-core-impl/nm-setting-bridge.c +++ b/src/libnm-core-impl/nm-setting-bridge.c @@ -472,17 +472,17 @@ nm_bridge_vlan_to_str(const NMBridgeVlan *vlan, GError **error) NMBridgeVlan * nm_bridge_vlan_from_str(const char *str, GError **error) { - NMBridgeVlan *vlan = NULL; - gs_free const char **tokens = NULL; - guint i, vid_start, vid_end = 0; - gboolean pvid = FALSE; - gboolean untagged = FALSE; - char *c; + NMBridgeVlan *vlan = NULL; + gs_free char **tokens = NULL; + guint i, vid_start, vid_end = 0; + gboolean pvid = FALSE; + gboolean untagged = FALSE; + char *c; g_return_val_if_fail(str, NULL); g_return_val_if_fail(!error || !*error, NULL); - tokens = nm_utils_escaped_tokens_split(str, NM_ASCII_SPACES); + tokens = (char **) nm_utils_escaped_tokens_split(str, NM_ASCII_SPACES); if (!tokens || !tokens[0]) { g_set_error_literal(error, NM_CONNECTION_ERROR, diff --git a/src/libnm-core-impl/nm-setting-geneve.c b/src/libnm-core-impl/nm-setting-geneve.c new file mode 100644 index 00000000..b01fcd9a --- /dev/null +++ b/src/libnm-core-impl/nm-setting-geneve.c @@ -0,0 +1,354 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2026 Red Hat, Inc. + */ + +#include "libnm-core-impl/nm-default-libnm-core.h" + +#include "nm-setting-geneve.h" + +#include <stdlib.h> + +#include "nm-utils.h" +#include "nm-setting-private.h" + +/** + * SECTION:nm-setting-geneve + * @short_description: Describes connection properties for GENEVE interfaces + * + * The #NMSettingGeneve object is a #NMSetting subclass that describes properties + * necessary for connection to GENEVE interfaces. + **/ + +#define DST_PORT_DEFAULT 6081 + +NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_ID, + PROP_REMOTE, + PROP_DESTINATION_PORT, + PROP_TOS, + PROP_TTL, + PROP_DF, ); + +typedef struct { + char *remote; + guint32 id; + guint32 destination_port; + guint32 tos; + gint32 ttl; + int df; +} NMSettingGenevePrivate; + +/** + * NMSettingGeneve: + * + * GENEVE Settings + */ +struct _NMSettingGeneve { + NMSetting parent; + NMSettingGenevePrivate _priv; +}; + +struct _NMSettingGeneveClass { + NMSettingClass parent; +}; + +G_DEFINE_TYPE(NMSettingGeneve, nm_setting_geneve, NM_TYPE_SETTING) + +#define NM_SETTING_GENEVE_GET_PRIVATE(o) \ + _NM_GET_PRIVATE(o, NMSettingGeneve, NM_IS_SETTING_GENEVE, NMSetting) + +/*****************************************************************************/ + +/** + * nm_setting_geneve_get_id: + * @setting: the #NMSettingGeneve + * + * Returns: the #NMSettingGeneve:id property of the setting + * + * Since: 1.58, 1.56.1 + **/ +guint +nm_setting_geneve_get_id(NMSettingGeneve *setting) +{ + g_return_val_if_fail(NM_IS_SETTING_GENEVE(setting), 0); + + return NM_SETTING_GENEVE_GET_PRIVATE(setting)->id; +} + +/** + * nm_setting_geneve_get_remote: + * @setting: the #NMSettingGeneve + * + * Returns: the #NMSettingGeneve:remote property of the setting + * + * Since: 1.58, 1.56.1 + **/ +const char * +nm_setting_geneve_get_remote(NMSettingGeneve *setting) +{ + g_return_val_if_fail(NM_IS_SETTING_GENEVE(setting), NULL); + + return NM_SETTING_GENEVE_GET_PRIVATE(setting)->remote; +} + +/** + * nm_setting_geneve_get_destination_port: + * @setting: the #NMSettingGeneve + * + * Returns: the #NMSettingGeneve:destination-port property of the setting + * + * Since: 1.58, 1.56.1 + **/ +guint +nm_setting_geneve_get_destination_port(NMSettingGeneve *setting) +{ + g_return_val_if_fail(NM_IS_SETTING_GENEVE(setting), DST_PORT_DEFAULT); + + return NM_SETTING_GENEVE_GET_PRIVATE(setting)->destination_port; +} + +/** + * nm_setting_geneve_get_tos: + * @setting: the #NMSettingGeneve + * + * Returns: the #NMSettingGeneve:tos property of the setting + * + * Since: 1.58, 1.56.1 + **/ +guint +nm_setting_geneve_get_tos(NMSettingGeneve *setting) +{ + g_return_val_if_fail(NM_IS_SETTING_GENEVE(setting), 0); + + return NM_SETTING_GENEVE_GET_PRIVATE(setting)->tos; +} + +/** + * nm_setting_geneve_get_ttl: + * @setting: the #NMSettingGeneve + * + * Returns: the #NMSettingGeneve:ttl property of the setting + * + * Since: 1.58, 1.56.1 + **/ +guint +nm_setting_geneve_get_ttl(NMSettingGeneve *setting) +{ + g_return_val_if_fail(NM_IS_SETTING_GENEVE(setting), 0); + + return NM_SETTING_GENEVE_GET_PRIVATE(setting)->ttl; +} + +/** + * nm_setting_geneve_get_df: + * @setting: the #NMSettingGeneve + * + * Returns: the #NMSettingGeneve:df property of the setting + * + * Since: 1.58, 1.56.1 + **/ +NMSettingGeneveDf +nm_setting_geneve_get_df(NMSettingGeneve *setting) +{ + g_return_val_if_fail(NM_IS_SETTING_GENEVE(setting), NM_SETTING_GENEVE_DF_UNSET); + + return NM_SETTING_GENEVE_GET_PRIVATE(setting)->df; +} + +/*****************************************************************************/ + +static gboolean +verify(NMSetting *setting, NMConnection *connection, GError **error) +{ + NMSettingGenevePrivate *priv = NM_SETTING_GENEVE_GET_PRIVATE(setting); + + if (priv->id == 0) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_MISSING_PROPERTY, + _("property is required")); + g_prefix_error(error, "%s.%s: ", NM_SETTING_GENEVE_SETTING_NAME, NM_SETTING_GENEVE_ID); + return FALSE; + } + + if (!priv->remote) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_MISSING_PROPERTY, + _("property is required")); + g_prefix_error(error, "%s.%s: ", NM_SETTING_GENEVE_SETTING_NAME, NM_SETTING_GENEVE_REMOTE); + return FALSE; + } + + if (!nm_inet_parse_bin(AF_UNSPEC, priv->remote, NULL, NULL)) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("'%s' is not a valid IP address"), + priv->remote); + g_prefix_error(error, "%s.%s: ", NM_SETTING_GENEVE_SETTING_NAME, NM_SETTING_GENEVE_REMOTE); + return FALSE; + } + + return TRUE; +} + +/*****************************************************************************/ + +static void +nm_setting_geneve_init(NMSettingGeneve *self) +{} + +/** + * nm_setting_geneve_new: + * + * Creates a new #NMSettingGeneve object with default values. + * + * Returns: (transfer full): the new empty #NMSettingGeneve object + * + * Since: 1.58, 1.56.1 + **/ +NMSetting * +nm_setting_geneve_new(void) +{ + return g_object_new(NM_TYPE_SETTING_GENEVE, NULL); +} + +static void +nm_setting_geneve_class_init(NMSettingGeneveClass *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->get_property = _nm_setting_property_get_property_direct; + object_class->set_property = _nm_setting_property_set_property_direct; + + setting_class->verify = verify; + + /** + * NMSettingGeneve:id: + * + * Specifies the GENEVE Network Identifier (or GENEVE Segment Identifier) to + * use. + * + * Since: 1.58, 1.56.1 + **/ + _nm_setting_property_define_direct_uint32(properties_override, + obj_properties, + NM_SETTING_GENEVE_ID, + PROP_ID, + 0, + (1 << 24) - 1, + 0, + NM_SETTING_PARAM_INFERRABLE, + NMSettingGenevePrivate, + id); + + /** + * NMSettingGeneve:remote: + * + * Specifies the unicast destination IP address to use in outgoing packets + * when communicating with the remote GENEVE tunnel endpoint. + * + * Since: 1.58, 1.56.1 + **/ + _nm_setting_property_define_direct_string(properties_override, + obj_properties, + NM_SETTING_GENEVE_REMOTE, + PROP_REMOTE, + NM_SETTING_PARAM_REQUIRED, + NMSettingGenevePrivate, + remote, + .direct_set_string_ip_address_addr_family = + AF_UNSPEC + 1, + .direct_string_allow_empty = TRUE); + + /** + * NMSettingGeneve:destination-port: + * + * Specifies the UDP destination port to communicate to the remote GENEVE + * tunnel endpoint. + * + * Since: 1.58, 1.56.1 + **/ + _nm_setting_property_define_direct_uint32(properties_override, + obj_properties, + NM_SETTING_GENEVE_DESTINATION_PORT, + PROP_DESTINATION_PORT, + 0, + G_MAXUINT16, + DST_PORT_DEFAULT, + NM_SETTING_PARAM_INFERRABLE, + NMSettingGenevePrivate, + destination_port); + + /** + * NMSettingGeneve:tos: + * + * Specifies the TOS value to use in outgoing packets. + * The special value "inherit" (1) means inherit from outer packet. + * + * Since: 1.58, 1.56.1 + **/ + _nm_setting_property_define_direct_uint32(properties_override, + obj_properties, + NM_SETTING_GENEVE_TOS, + PROP_TOS, + 0, + 255, + 0, + NM_SETTING_PARAM_INFERRABLE, + NMSettingGenevePrivate, + tos); + + /** + * NMSettingGeneve:ttl: + * + * Specifies the time-to-live value to use in outgoing packets. + * The special value "inherit" (-1) means inherit from outer packet, 0 means auto, 1-255 are fixed values. + * + * Since: 1.58, 1.56.1 + **/ + _nm_setting_property_define_direct_int32(properties_override, + obj_properties, + NM_SETTING_GENEVE_TTL, + PROP_TTL, + -1, + 255, + 0, + NM_SETTING_PARAM_INFERRABLE, + NMSettingGenevePrivate, + ttl); + + /** + * NMSettingGeneve:df: + * + * Specifies how the Don't Fragment (DF) flag should be handled in the outer IP + * header of GENEVE tunnel packets. + * + * %NM_SETTING_GENEVE_DF_UNSET (0): Don't set the DF flag, packets may be fragmented. + * %NM_SETTING_GENEVE_DF_SET (1): Always set the DF flag, packets will not be fragmented. + * %NM_SETTING_GENEVE_DF_INHERIT (2): Inherit the DF flag from the inner IP header. + * + * Since: 1.58, 1.56.1 + **/ + _nm_setting_property_define_direct_enum(properties_override, + obj_properties, + NM_SETTING_GENEVE_DF, + PROP_DF, + NM_TYPE_SETTING_GENEVE_DF, + NM_SETTING_GENEVE_DF_UNSET, + NM_SETTING_PARAM_INFERRABLE, + NULL, + NMSettingGenevePrivate, + df); + + g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); + + _nm_setting_class_commit(setting_class, + NM_META_SETTING_TYPE_GENEVE, + NULL, + properties_override, + G_STRUCT_OFFSET(NMSettingGeneve, _priv)); +} diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index 1aecc20c..f4ee094c 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -5079,6 +5079,9 @@ routing_rules_to_dbus(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil) gboolean any = FALSE; guint i; + if (!_nm_connection_serialize_non_secret(flags)) + return NULL; + priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(self); if (!priv->routing_rules || priv->routing_rules->len == 0) diff --git a/src/libnm-core-impl/nm-setting.c b/src/libnm-core-impl/nm-setting.c index 295eabe7..e87f39b2 100644 --- a/src/libnm-core-impl/nm-setting.c +++ b/src/libnm-core-impl/nm-setting.c @@ -4523,7 +4523,7 @@ nm_range_from_str(const char *str, GError **error) gs_free char *str_free = NULL; guint64 start; guint64 end = 0; - char *c; + const char *c; g_return_val_if_fail(str, NULL); g_return_val_if_fail(!error || !*error, NULL); |