summaryrefslogtreecommitdiff
path: root/libnm
diff options
context:
space:
mode:
Diffstat (limited to 'libnm')
-rw-r--r--libnm/libnm.ver2
-rw-r--r--libnm/meson.build2
-rw-r--r--libnm/nm-device-vrf.c145
-rw-r--r--libnm/nm-device-vrf.h35
-rw-r--r--libnm/nm-device.c3
-rw-r--r--libnm/nm-libnm-utils.c1
-rw-r--r--libnm/nm-libnm-utils.h3
-rw-r--r--libnm/nm-types.h1
8 files changed, 191 insertions, 1 deletions
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index 8544fd43d7..3ff469b0c5 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -1664,6 +1664,8 @@ global:
nm_client_get_object_by_path;
nm_client_get_permissions_state;
nm_client_instance_flags_get_type;
+ nm_device_vrf_get_table;
+ nm_device_vrf_get_type;
nm_object_get_client;
nm_setting_vrf_get_table;
nm_setting_vrf_get_type;
diff --git a/libnm/meson.build b/libnm/meson.build
index 7680b9ebe0..29a21db76a 100644
--- a/libnm/meson.build
+++ b/libnm/meson.build
@@ -39,6 +39,7 @@ libnm_headers = files(
'nm-device-team.h',
'nm-device-tun.h',
'nm-device-vlan.h',
+ 'nm-device-vrf.h',
'nm-device-vxlan.h',
'nm-device-wifi-p2p.h',
'nm-device-wifi.h',
@@ -104,6 +105,7 @@ libnm_sources = files(
'nm-device-team.c',
'nm-device-tun.c',
'nm-device-vlan.c',
+ 'nm-device-vrf.c',
'nm-device-vxlan.c',
'nm-device-wifi-p2p.c',
'nm-device-wifi.c',
diff --git a/libnm/nm-device-vrf.c b/libnm/nm-device-vrf.c
new file mode 100644
index 0000000000..2036e16f8c
--- /dev/null
+++ b/libnm/nm-device-vrf.c
@@ -0,0 +1,145 @@
+// SPDX-License-Identifier: LGPL-2.1+
+
+#include "nm-default.h"
+
+#include "nm-device-vrf.h"
+
+#include "nm-setting-connection.h"
+#include "nm-setting-vrf.h"
+#include "nm-utils.h"
+#include "nm-object-private.h"
+
+/*****************************************************************************/
+
+NM_GOBJECT_PROPERTIES_DEFINE_BASE (
+ PROP_TABLE,
+);
+
+typedef struct {
+ guint32 table;
+} NMDeviceVrfPrivate;
+
+struct _NMDeviceVrf {
+ NMDevice parent;
+ NMDeviceVrfPrivate _priv;
+};
+
+struct _NMDeviceVrfClass {
+ NMDeviceClass parent;
+};
+
+G_DEFINE_TYPE (NMDeviceVrf, nm_device_vrf, NM_TYPE_DEVICE)
+
+#define NM_DEVICE_VRF_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMDeviceVrf, NM_IS_DEVICE_VRF, NMObject, NMDevice)
+
+/*****************************************************************************/
+
+/**
+ * nm_device_vrf_get_table:
+ * @device: a #NMDeviceVrf
+ *
+ * Returns: the device's VRF routing table.
+ *
+ * Since: 1.24
+ **/
+guint32
+nm_device_vrf_get_table (NMDeviceVrf *device)
+{
+ g_return_val_if_fail (NM_IS_DEVICE_VRF (device), 0);
+
+ return NM_DEVICE_VRF_GET_PRIVATE (device)->table;
+}
+
+static gboolean
+connection_compatible (NMDevice *device, NMConnection *connection, GError **error)
+{
+ NMSettingVrf *s_vrf;
+
+ if (!NM_DEVICE_CLASS (nm_device_vrf_parent_class)->connection_compatible (device, connection, error))
+ return FALSE;
+
+ if (!nm_connection_is_type (connection, NM_SETTING_VRF_SETTING_NAME)) {
+ g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
+ _("The connection was not a VRF connection."));
+ return FALSE;
+ }
+
+ s_vrf = (NMSettingVrf *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VRF);
+ if (nm_setting_vrf_get_table (s_vrf) != nm_device_vrf_get_table (NM_DEVICE_VRF (device))) {
+ g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
+ _("The VRF table of the device and the connection didn't match."));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static GType
+get_setting_type (NMDevice *device)
+{
+ return NM_TYPE_SETTING_VRF;
+}
+
+/*****************************************************************************/
+
+static void
+get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NMDeviceVrf *device = NM_DEVICE_VRF (object);
+
+ switch (prop_id) {
+ case PROP_TABLE:
+ g_value_set_uint (value, nm_device_vrf_get_table (device));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+nm_device_vrf_init (NMDeviceVrf *device)
+{
+}
+
+const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_vrf = NML_DBUS_META_IFACE_INIT_PROP (
+ NM_DBUS_INTERFACE_DEVICE_VRF,
+ nm_device_vrf_get_type,
+ NML_DBUS_META_INTERFACE_PRIO_INSTANTIATE_HIGH,
+ NML_DBUS_META_IFACE_DBUS_PROPERTIES (
+ NML_DBUS_META_PROPERTY_INIT_U ("Table", PROP_TABLE, NMDeviceVrf, _priv.table),
+ ),
+);
+
+static void
+nm_device_vrf_class_init (NMDeviceVrfClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ NMObjectClass *nm_object_class = NM_OBJECT_CLASS (klass);
+ NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
+
+ object_class->get_property = get_property;
+
+ _NM_OBJECT_CLASS_INIT_PRIV_PTR_DIRECT (nm_object_class, NMDeviceVrf);
+
+ device_class->connection_compatible = connection_compatible;
+ device_class->get_setting_type = get_setting_type;
+
+ /**
+ * NMDeviceVrf:table:
+ *
+ * The device's VRF table.
+ *
+ * Since: 1.24
+ **/
+ obj_properties[PROP_TABLE] =
+ g_param_spec_uint (NM_DEVICE_VRF_TABLE, "", "",
+ 0, G_MAXUINT32, 0,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ _nml_dbus_meta_class_init_with_properties (object_class, &_nml_dbus_meta_iface_nm_device_vrf);
+}
diff --git a/libnm/nm-device-vrf.h b/libnm/nm-device-vrf.h
new file mode 100644
index 0000000000..bf7499ca70
--- /dev/null
+++ b/libnm/nm-device-vrf.h
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: LGPL-2.1+
+
+#ifndef __NM_DEVICE_VRF_H__
+#define __NM_DEVICE_VRF_H__
+
+#if !defined (__NETWORKMANAGER_H_INSIDE__) && !defined (NETWORKMANAGER_COMPILATION)
+#error "Only <NetworkManager.h> can be included directly."
+#endif
+
+#include "nm-device.h"
+
+G_BEGIN_DECLS
+
+#define NM_TYPE_DEVICE_VRF (nm_device_vrf_get_type ())
+#define NM_DEVICE_VRF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_VRF, NMDeviceVrf))
+#define NM_DEVICE_VRF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_VRF, NMDeviceVrfClass))
+#define NM_IS_DEVICE_VRF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_VRF))
+#define NM_IS_DEVICE_VRF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_VRF))
+#define NM_DEVICE_VRF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_VRF, NMDeviceVrfClass))
+
+#define NM_DEVICE_VRF_TABLE "table"
+
+/**
+ * NMDeviceVrf:
+ */
+typedef struct _NMDeviceVrfClass NMDeviceVrfClass;
+
+NM_AVAILABLE_IN_1_24
+GType nm_device_vrf_get_type (void);
+NM_AVAILABLE_IN_1_24
+guint32 nm_device_vrf_get_table (NMDeviceVrf *device);
+
+G_END_DECLS
+
+#endif /* __NM_DEVICE_VRF_H__ */
diff --git a/libnm/nm-device.c b/libnm/nm-device.c
index ade67b0474..77b7da6b09 100644
--- a/libnm/nm-device.c
+++ b/libnm/nm-device.c
@@ -296,6 +296,7 @@ coerce_type (NMDeviceType type)
case NM_DEVICE_TYPE_6LOWPAN:
case NM_DEVICE_TYPE_WIREGUARD:
case NM_DEVICE_TYPE_WIFI_P2P:
+ case NM_DEVICE_TYPE_VRF:
return type;
}
return NM_DEVICE_TYPE_UNKNOWN;
@@ -1505,6 +1506,8 @@ get_type_name (NMDevice *device)
return _("WireGuard");
case NM_DEVICE_TYPE_WIFI_P2P:
return _("Wi-Fi P2P");
+ case NM_DEVICE_TYPE_VRF:
+ return _("VRF");
case NM_DEVICE_TYPE_GENERIC:
case NM_DEVICE_TYPE_UNUSED1:
case NM_DEVICE_TYPE_UNUSED2:
diff --git a/libnm/nm-libnm-utils.c b/libnm/nm-libnm-utils.c
index 5f78f264f2..f04a7419f5 100644
--- a/libnm/nm-libnm-utils.c
+++ b/libnm/nm-libnm-utils.c
@@ -694,6 +694,7 @@ const NMLDBusMetaIface *const _nml_dbus_meta_ifaces[] = {
&_nml_dbus_meta_iface_nm_device_tun,
&_nml_dbus_meta_iface_nm_device_veth,
&_nml_dbus_meta_iface_nm_device_vlan,
+ &_nml_dbus_meta_iface_nm_device_vrf,
&_nml_dbus_meta_iface_nm_device_vxlan,
&_nml_dbus_meta_iface_nm_device_wifip2p,
&_nml_dbus_meta_iface_nm_device_wireguard,
diff --git a/libnm/nm-libnm-utils.h b/libnm/nm-libnm-utils.h
index db6f55ec0e..ec9f23ba8e 100644
--- a/libnm/nm-libnm-utils.h
+++ b/libnm/nm-libnm-utils.h
@@ -505,7 +505,7 @@ struct _NMLDBusMetaIface {
NML_DBUS_META_IFACE_INIT (__VA_ARGS__ \
NML_DBUS_META_IFACE_OBJ_PROPERTIES ())
-extern const NMLDBusMetaIface *const _nml_dbus_meta_ifaces[43];
+extern const NMLDBusMetaIface *const _nml_dbus_meta_ifaces[44];
extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm;
extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_accesspoint;
@@ -535,6 +535,7 @@ extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_team;
extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_tun;
extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_veth;
extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_vlan;
+extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_vrf;
extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_vxlan;
extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_wifip2p;
extern const NMLDBusMetaIface _nml_dbus_meta_iface_nm_device_wired;
diff --git a/libnm/nm-types.h b/libnm/nm-types.h
index 11e9f05570..d390e61a3b 100644
--- a/libnm/nm-types.h
+++ b/libnm/nm-types.h
@@ -37,6 +37,7 @@ typedef struct _NMDevicePpp NMDevicePpp;
typedef struct _NMDeviceTeam NMDeviceTeam;
typedef struct _NMDeviceTun NMDeviceTun;
typedef struct _NMDeviceVlan NMDeviceVlan;
+typedef struct _NMDeviceVrf NMDeviceVrf;
typedef struct _NMDeviceVxlan NMDeviceVxlan;
typedef struct _NMDeviceWifi NMDeviceWifi;
typedef struct _NMDeviceWifiP2P NMDeviceWifiP2P;