From b47c94666c9fbdaef5b5a410f87ae85e62fc1136 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 17 Nov 2023 15:12:57 +0100 Subject: [PATCH 1/2] libnm: mark missing "FwMark" for NMDeviceIPTunnel as ignored This was forgotten to implement. But we cannot just forget about it. Libnm emits a warning about unknown properties, exactly to catch such bugs. Properties that are not implemented, must be marked to be ignored. Next, support for this property will be added. But that introduces new API, which cannot be backported. Hence, first fix the problem by marking the property as ignored. This is a backportable change. $ LIBNM_CLIENT_DEBUG="warning" G_DEBUG=fatal-warnings nmcli (process:270215): nm-WARNING **: 15:22:56.125: libnm-dbus: nmclient[8094a8c217aae461]: get-managed-objects: [/org/freedesktop/NetworkManager/Devices/5]: ignore unknown property org.freedesktop.NetworkManager.Device.IPTunnel.FwMark Trace/breakpoint trap (core dumped) Fixes: 351c56249157 ('devices: support VTI tunnels') --- src/libnm-client-impl/nm-device-ip-tunnel.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libnm-client-impl/nm-device-ip-tunnel.c b/src/libnm-client-impl/nm-device-ip-tunnel.c index c34ad84b05..19fe6fd3df 100644 --- a/src/libnm-client-impl/nm-device-ip-tunnel.c +++ b/src/libnm-client-impl/nm-device-ip-tunnel.c @@ -357,6 +357,7 @@ const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_iptunnel = NML_DBUS_META_I PROP_FLOW_LABEL, NMDeviceIPTunnel, _priv.flow_label), + NML_DBUS_META_PROPERTY_INIT_IGNORE("FwMark", "u"), NML_DBUS_META_PROPERTY_INIT_S("InputKey", PROP_INPUT_KEY, NMDeviceIPTunnel, From 05fa5ba1a9126347a07a617c19ecd1e1eb052269 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 17 Nov 2023 15:12:57 +0100 Subject: [PATCH 2/2] libnm: implement missing "FwMark" property in NMDeviceIPTunnel --- src/libnm-client-impl/libnm.ver | 1 + src/libnm-client-impl/nm-device-ip-tunnel.c | 40 ++++++++++++++++++- src/libnm-client-impl/tests/test-libnm.c | 4 ++ src/libnm-client-public/nm-device-ip-tunnel.h | 3 ++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/libnm-client-impl/libnm.ver b/src/libnm-client-impl/libnm.ver index a92f8991ad..01df94c341 100644 --- a/src/libnm-client-impl/libnm.ver +++ b/src/libnm-client-impl/libnm.ver @@ -1947,6 +1947,7 @@ global: libnm_1_46_0 { global: nm_access_point_get_bandwidth; + nm_device_ip_tunnel_get_fwmark; nm_ethtool_optname_is_channels; nm_ethtool_optname_is_eee; } libnm_1_44_0; diff --git a/src/libnm-client-impl/nm-device-ip-tunnel.c b/src/libnm-client-impl/nm-device-ip-tunnel.c index 19fe6fd3df..cba02c751c 100644 --- a/src/libnm-client-impl/nm-device-ip-tunnel.c +++ b/src/libnm-client-impl/nm-device-ip-tunnel.c @@ -26,6 +26,7 @@ NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_MODE, PROP_OUTPUT_KEY, PROP_ENCAPSULATION_LIMIT, PROP_FLOW_LABEL, + PROP_FWMARK, PROP_FLAGS, ); typedef struct { @@ -37,6 +38,7 @@ typedef struct { guint32 mode; guint32 flow_label; guint32 flags; + guint32 fwmark; guint8 ttl; guint8 tos; guint8 encapsulation_limit; @@ -236,6 +238,23 @@ nm_device_ip_tunnel_get_flow_label(NMDeviceIPTunnel *device) return NM_DEVICE_IP_TUNNEL_GET_PRIVATE(device)->flow_label; } +/** + * nm_device_ip_tunnel_get_fwmark: + * @device: a #NMDeviceIPTunnel + * + * Returns: the fwmark assigned to tunnel packets. This property applies only + * to VTI tunnels. + * + * Since: 1.46 + **/ +guint32 +nm_device_ip_tunnel_get_fwmark(NMDeviceIPTunnel *device) +{ + g_return_val_if_fail(NM_IS_DEVICE_IP_TUNNEL(device), 0); + + return NM_DEVICE_IP_TUNNEL_GET_PRIVATE(device)->fwmark; +} + /** * nm_device_ip_tunnel_get_flags: * @device: a #NMDeviceIPTunnel @@ -334,6 +353,9 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) case PROP_FLOW_LABEL: g_value_set_uint(value, nm_device_ip_tunnel_get_flow_label(device)); break; + case PROP_FWMARK: + g_value_set_uint(value, nm_device_ip_tunnel_get_fwmark(device)); + break; case PROP_FLAGS: g_value_set_uint(value, nm_device_ip_tunnel_get_flags(device)); break; @@ -357,7 +379,7 @@ const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_iptunnel = NML_DBUS_META_I PROP_FLOW_LABEL, NMDeviceIPTunnel, _priv.flow_label), - NML_DBUS_META_PROPERTY_INIT_IGNORE("FwMark", "u"), + NML_DBUS_META_PROPERTY_INIT_U("FwMark", PROP_FWMARK, NMDeviceIPTunnel, _priv.fwmark), NML_DBUS_META_PROPERTY_INIT_S("InputKey", PROP_INPUT_KEY, NMDeviceIPTunnel, @@ -559,6 +581,22 @@ nm_device_ip_tunnel_class_init(NMDeviceIPTunnelClass *klass) 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + /** + * NMDeviceIPTunnel:fwmark: + * + * The fwmark value to assign to tunnel packets. This property applies only + * to VTI tunnels. + * + * Since: 1.46 + **/ + obj_properties[PROP_FWMARK] = g_param_spec_uint(NM_DEVICE_IP_TUNNEL_FWMARK, + "", + "", + 0, + G_MAXUINT32, + 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + /** * NMDeviceIPTunnel:flags: * diff --git a/src/libnm-client-impl/tests/test-libnm.c b/src/libnm-client-impl/tests/test-libnm.c index 456f185561..59774f966b 100644 --- a/src/libnm-client-impl/tests/test-libnm.c +++ b/src/libnm-client-impl/tests/test-libnm.c @@ -3188,6 +3188,10 @@ check_dbus_properties: && nm_streq(pspec->name, NM_DEVICE_WIREGUARD_FWMARK)) { g_assert_cmpstr(obj_property_name, ==, "fw-mark"); expected_property_name = NM_DEVICE_WIREGUARD_FWMARK; + } else if (mif == &_nml_dbus_meta_iface_nm_device_iptunnel + && nm_streq(pspec->name, NM_DEVICE_IP_TUNNEL_FWMARK)) { + g_assert_cmpstr(obj_property_name, ==, "fw-mark"); + expected_property_name = NM_DEVICE_IP_TUNNEL_FWMARK; } else if (NM_IN_SET(mif, &_nml_dbus_meta_iface_nm_ip4config, &_nml_dbus_meta_iface_nm_ip6config) diff --git a/src/libnm-client-public/nm-device-ip-tunnel.h b/src/libnm-client-public/nm-device-ip-tunnel.h index 4b9b9f5b1b..c3c3d0f59a 100644 --- a/src/libnm-client-public/nm-device-ip-tunnel.h +++ b/src/libnm-client-public/nm-device-ip-tunnel.h @@ -37,6 +37,7 @@ G_BEGIN_DECLS #define NM_DEVICE_IP_TUNNEL_OUTPUT_KEY "output-key" #define NM_DEVICE_IP_TUNNEL_ENCAPSULATION_LIMIT "encapsulation-limit" #define NM_DEVICE_IP_TUNNEL_FLOW_LABEL "flow-label" +#define NM_DEVICE_IP_TUNNEL_FWMARK "fwmark" #define NM_DEVICE_IP_TUNNEL_FLAGS "flags" /** @@ -72,6 +73,8 @@ NM_AVAILABLE_IN_1_2 guint8 nm_device_ip_tunnel_get_encapsulation_limit(NMDeviceIPTunnel *device); NM_AVAILABLE_IN_1_2 guint nm_device_ip_tunnel_get_flow_label(NMDeviceIPTunnel *device); +NM_AVAILABLE_IN_1_46 +guint32 nm_device_ip_tunnel_get_fwmark(NMDeviceIPTunnel *device); NM_AVAILABLE_IN_1_12 NMIPTunnelFlags nm_device_ip_tunnel_get_flags(NMDeviceIPTunnel *device);