summary refs log tree commit diff
path: root/src/devices/nm-device-infiniband.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2017-01-17 20:25:09 +0100
committerMichael Biebl <biebl@debian.org>2017-01-17 20:25:09 +0100
commit58f8be580039b0575b197b9573a1c92745d96d30 (patch)
tree2c226233f623a0dcb529be0eb8cdf97e4a2ae0c0 /src/devices/nm-device-infiniband.c
parent45cb5bb3c0e6edb887cf69b417fcaf7053814a9b (diff)
New upstream version 1.5.90 upstream/1.5.90
Diffstat (limited to 'src/devices/nm-device-infiniband.c')
-rw-r--r--src/devices/nm-device-infiniband.c146
1 files changed, 80 insertions, 66 deletions
diff --git a/src/devices/nm-device-infiniband.c b/src/devices/nm-device-infiniband.c
index e2a67de4..60f1aefa 100644
--- a/src/devices/nm-device-infiniband.c
+++ b/src/devices/nm-device-infiniband.c
@@ -20,46 +20,55 @@
 
 #include "nm-default.h"
 
+#include "nm-device-infiniband.h"
+
 #include <linux/if_infiniband.h>
 
-#include "nm-device-infiniband.h"
 #include "NetworkManagerUtils.h"
 #include "nm-device-private.h"
-#include "nm-enum-types.h"
-#include "nm-activation-request.h"
+#include "nm-act-request.h"
 #include "nm-ip4-config.h"
-#include "nm-platform.h"
+#include "platform/nm-platform.h"
 #include "nm-device-factory.h"
 #include "nm-core-internal.h"
 
-#include "nmdbus-device-infiniband.h"
+#include "introspection/org.freedesktop.NetworkManager.Device.Infiniband.h"
 
-G_DEFINE_TYPE (NMDeviceInfiniband, nm_device_infiniband, NM_TYPE_DEVICE)
+#define NM_DEVICE_INFINIBAND_IS_PARTITION "is-partition"
 
-#define NM_DEVICE_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_INFINIBAND, NMDeviceInfinibandPrivate))
+/*****************************************************************************/
 
-#define NM_DEVICE_INFINIBAND_IS_PARTITION "is-partition"
+NM_GOBJECT_PROPERTIES_DEFINE_BASE (
+	PROP_IS_PARTITION,
+);
 
 typedef struct {
 	gboolean is_partition;
-	int parent_ifindex, p_key;
+	int parent_ifindex;
+	int p_key;
 } NMDeviceInfinibandPrivate;
 
-enum {
-	PROP_0,
-	PROP_IS_PARTITION,
+struct _NMDeviceInfiniband {
+	NMDevice parent;
+	NMDeviceInfinibandPrivate _priv;
+};
 
-	LAST_PROP
+struct _NMDeviceInfinibandClass {
+	NMDeviceClass parent;
 };
 
-/*************************************************************/
+G_DEFINE_TYPE (NMDeviceInfiniband, nm_device_infiniband, NM_TYPE_DEVICE)
+
+#define NM_DEVICE_INFINIBAND_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMDeviceInfiniband, NM_IS_DEVICE_INFINIBAND)
+
+/*****************************************************************************/
 
 static NMDeviceCapabilities
-get_generic_capabilities (NMDevice *dev)
+get_generic_capabilities (NMDevice *device)
 {
 	guint32 caps = NM_DEVICE_CAP_CARRIER_DETECT;
 
-	if (NM_DEVICE_INFINIBAND_GET_PRIVATE (dev)->is_partition)
+	if (NM_DEVICE_INFINIBAND_GET_PRIVATE ((NMDeviceInfiniband *) device)->is_partition)
 		caps |= NM_DEVICE_CAP_IS_SOFTWARE;
 
 	return caps;
@@ -68,10 +77,11 @@ get_generic_capabilities (NMDevice *dev)
 static NMActStageReturn
 act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
 {
+	nm_auto_close int dirfd = -1;
 	NMActStageReturn ret;
 	NMSettingInfiniband *s_infiniband;
+	char ifname_verified[IFNAMSIZ];
 	const char *transport_mode;
-	char *mode_path;
 	gboolean ok, no_firmware = FALSE;
 
 	g_return_val_if_fail (reason != NULL, NM_ACT_STAGE_RETURN_FAILURE);
@@ -85,11 +95,8 @@ act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
 
 	transport_mode = nm_setting_infiniband_get_transport_mode (s_infiniband);
 
-	mode_path = g_strdup_printf ("/sys/class/net/%s/mode",
-	                             NM_ASSERT_VALID_PATH_COMPONENT (nm_device_get_iface (dev)));
-	if (!g_file_test (mode_path, G_FILE_TEST_EXISTS)) {
-		g_free (mode_path);
-
+	dirfd = nm_platform_sysctl_open_netdir (NM_PLATFORM_GET, nm_device_get_ifindex (dev), ifname_verified);
+	if (dirfd < 0) {
 		if (!strcmp (transport_mode, "datagram"))
 			return NM_ACT_STAGE_RETURN_SUCCESS;
 		else {
@@ -100,8 +107,7 @@ act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
 
 	/* With some drivers the interface must be down to set transport mode */
 	nm_device_take_down (dev, TRUE);
-	ok = nm_platform_sysctl_set (NM_PLATFORM_GET, mode_path, transport_mode);
-	g_free (mode_path);
+	ok = nm_platform_sysctl_set (NM_PLATFORM_GET, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname_verified, "mode"), transport_mode);
 	nm_device_bring_up (dev, TRUE, &no_firmware);
 
 	if (!ok) {
@@ -112,22 +118,30 @@ act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
 	return NM_ACT_STAGE_RETURN_SUCCESS;
 }
 
-static void
-ip4_config_pre_commit (NMDevice *self, NMIP4Config *config)
+static guint32
+get_configured_mtu (NMDevice *device, gboolean *out_is_user_config)
 {
-	NMConnection *connection;
-	NMSettingInfiniband *s_infiniband;
+	NMSettingInfiniband *setting;
+	gint64 mtu_default;
 	guint32 mtu;
 
-	connection = nm_device_get_applied_connection (self);
-	g_assert (connection);
-	s_infiniband = nm_connection_get_setting_infiniband (connection);
-	g_assert (s_infiniband);
+	nm_assert (NM_IS_DEVICE (device));
+	nm_assert (out_is_user_config);
+
+	setting = NM_SETTING_INFINIBAND (nm_device_get_applied_setting (device, NM_TYPE_SETTING_INFINIBAND));
+	if (!setting)
+		g_return_val_if_reached (0);
 
-	/* MTU override */
-	mtu = nm_setting_infiniband_get_mtu (s_infiniband);
-	if (mtu)
-		nm_ip4_config_set_mtu (config, mtu, NM_IP_CONFIG_SOURCE_USER);
+	mtu = nm_setting_infiniband_get_mtu (setting);
+	if (mtu == 0) {
+		mtu_default = nm_device_get_configured_mtu_from_connection_default (device, "infiniband.mtu");
+		if (mtu_default >= 0) {
+			*out_is_user_config = TRUE;
+			return (guint32) mtu_default;
+		}
+	}
+	*out_is_user_config = (mtu != 0);
+	return mtu ?: NM_DEVICE_DEFAULT_MTU_INFINIBAND;
 }
 
 static gboolean
@@ -241,7 +255,7 @@ create_and_realize (NMDevice *device,
                     const NMPlatformLink **out_plink,
                     GError **error)
 {
-	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (device);
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE ((NMDeviceInfiniband *) device);
 	NMSettingInfiniband *s_infiniband;
 	NMPlatformError plerr;
 
@@ -294,11 +308,13 @@ create_and_realize (NMDevice *device,
 static gboolean
 unrealize (NMDevice *device, GError **error)
 {
-	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (device);
+	NMDeviceInfinibandPrivate *priv;
 	NMPlatformError plerr;
 
 	g_return_val_if_fail (NM_IS_DEVICE_INFINIBAND (device), FALSE);
 
+	priv = NM_DEVICE_INFINIBAND_GET_PRIVATE ((NMDeviceInfiniband *) device);
+
 	if (priv->p_key < 0) {
 		g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
 		             "Only InfiniBand partitions can be removed");
@@ -317,12 +333,7 @@ unrealize (NMDevice *device, GError **error)
 	return TRUE;
 }
 
-/*************************************************************/
-
-static void
-nm_device_infiniband_init (NMDeviceInfiniband * self)
-{
-}
+/*****************************************************************************/
 
 static void
 get_property (GObject *object, guint prop_id,
@@ -330,7 +341,7 @@ get_property (GObject *object, guint prop_id,
 {
 	switch (prop_id) {
 	case PROP_IS_PARTITION:
-		g_value_set_boolean (value, NM_DEVICE_INFINIBAND_GET_PRIVATE (object)->is_partition);
+		g_value_set_boolean (value, NM_DEVICE_INFINIBAND_GET_PRIVATE ((NMDeviceInfiniband *) object)->is_partition);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -340,11 +351,11 @@ get_property (GObject *object, guint prop_id,
 
 static void
 set_property (GObject *object, guint prop_id,
-			  const GValue *value, GParamSpec *pspec)
+              const GValue *value, GParamSpec *pspec)
 {
 	switch (prop_id) {
 	case PROP_IS_PARTITION:
-		NM_DEVICE_INFINIBAND_GET_PRIVATE (object)->is_partition = g_value_get_boolean (value);
+		NM_DEVICE_INFINIBAND_GET_PRIVATE ((NMDeviceInfiniband *) object)->is_partition = g_value_get_boolean (value);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -352,17 +363,21 @@ set_property (GObject *object, guint prop_id,
 	}
 }
 
+/*****************************************************************************/
+
+static void
+nm_device_infiniband_init (NMDeviceInfiniband * self)
+{
+}
+
 static void
 nm_device_infiniband_class_init (NMDeviceInfinibandClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	NMDeviceClass *parent_class = NM_DEVICE_CLASS (klass);
 
-	g_type_class_add_private (object_class, sizeof (NMDeviceInfinibandPrivate));
-
 	NM_DEVICE_CLASS_DECLARE_TYPES (klass, NM_SETTING_INFINIBAND_SETTING_NAME, NM_LINK_TYPE_INFINIBAND)
 
-	/* virtual methods */
 	object_class->get_property = get_property;
 	object_class->set_property = set_property;
 
@@ -374,25 +389,25 @@ nm_device_infiniband_class_init (NMDeviceInfinibandClass *klass)
 	parent_class->update_connection = update_connection;
 
 	parent_class->act_stage1_prepare = act_stage1_prepare;
-	parent_class->ip4_config_pre_commit = ip4_config_pre_commit;
+	parent_class->get_configured_mtu = get_configured_mtu;
 
-	/* properties */
-	g_object_class_install_property
-		(object_class, PROP_IS_PARTITION,
-		 g_param_spec_boolean (NM_DEVICE_INFINIBAND_IS_PARTITION, "", "",
-		                       FALSE,
-		                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-		                       G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_IS_PARTITION] =
+	     g_param_spec_boolean (NM_DEVICE_INFINIBAND_IS_PARTITION, "", "",
+	                           FALSE,
+	                           G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                           G_PARAM_STATIC_STRINGS);
+
+	g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
 
 	nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (klass),
 	                                        NMDBUS_TYPE_DEVICE_INFINIBAND_SKELETON,
 	                                        NULL);
 }
 
-/*************************************************************/
+/*****************************************************************************/
 
-#define NM_TYPE_INFINIBAND_FACTORY (nm_infiniband_factory_get_type ())
-#define NM_INFINIBAND_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_INFINIBAND_FACTORY, NMInfinibandFactory))
+#define NM_TYPE_INFINIBAND_DEVICE_FACTORY (nm_infiniband_device_factory_get_type ())
+#define NM_INFINIBAND_DEVICE_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_INFINIBAND_DEVICE_FACTORY, NMInfinibandDeviceFactory))
 
 static NMDevice *
 create_device (NMDeviceFactory *factory,
@@ -461,8 +476,7 @@ get_connection_iface (NMDeviceFactory *factory,
 NM_DEVICE_FACTORY_DEFINE_INTERNAL (INFINIBAND, Infiniband, infiniband,
 	NM_DEVICE_FACTORY_DECLARE_LINK_TYPES    (NM_LINK_TYPE_INFINIBAND)
 	NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_INFINIBAND_SETTING_NAME),
-	factory_iface->create_device = create_device;
-	factory_iface->get_connection_parent = get_connection_parent;
-	factory_iface->get_connection_iface = get_connection_iface;
-	)
-
+	factory_class->create_device = create_device;
+	factory_class->get_connection_parent = get_connection_parent;
+	factory_class->get_connection_iface = get_connection_iface;
+);