summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-01-02 10:56:13 +0100
committerThomas Haller <thaller@redhat.com>2017-01-04 14:18:01 +0100
commit992beb4f3440b046e0ba03e300d62da946a6f40e (patch)
treea09e143792390939c05a863226819694e8339289
parent6df235df744b618f0bdb6a2c83647a34da4abe82 (diff)
downloadNetworkManager-992beb4f3440b046e0ba03e300d62da946a6f40e.tar.gz
device: move tracking of peer device from NMDeviceVeth to NMDevice
-rw-r--r--src/devices/nm-device-veth.c76
1 files changed, 28 insertions, 48 deletions
diff --git a/src/devices/nm-device-veth.c b/src/devices/nm-device-veth.c
index a2fae62a32..a5a87a2ddd 100644
--- a/src/devices/nm-device-veth.c
+++ b/src/devices/nm-device-veth.c
@@ -23,9 +23,6 @@
#include <errno.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
-#include <linux/sockios.h>
-#include <sys/ioctl.h>
#include "nm-device-veth.h"
#include "nm-device-private.h"
@@ -41,8 +38,6 @@ _LOG_DECLARE_SELF(NMDeviceVeth);
/*****************************************************************************/
typedef struct {
- NMDevice *peer;
- gboolean ever_had_peer;
} NMDeviceVethPrivate;
struct _NMDeviceVeth {
@@ -67,42 +62,23 @@ G_DEFINE_TYPE (NMDeviceVeth, nm_device_veth, NM_TYPE_DEVICE_ETHERNET)
/*****************************************************************************/
static void
-set_peer (NMDeviceVeth *self, NMDevice *peer)
+update_properties (NMDevice *device)
{
- NMDeviceVethPrivate *priv = NM_DEVICE_VETH_GET_PRIVATE (self);
-
- if (!priv->peer) {
- priv->ever_had_peer = TRUE;
- priv->peer = peer;
- g_object_add_weak_pointer (G_OBJECT (peer), (gpointer *) &priv->peer);
-
- _notify (self, PROP_PEER);
- }
-}
+ NMDevice *peer;
+ int ifindex, peer_ifindex;
-static NMDevice *
-get_peer (NMDeviceVeth *self)
-{
- NMDeviceVethPrivate *priv = NM_DEVICE_VETH_GET_PRIVATE (self);
- NMDevice *device = NM_DEVICE (self), *peer = NULL;
- int peer_ifindex;
+ ifindex = nm_device_get_ifindex (device);
- if (priv->ever_had_peer)
- return priv->peer;
+ if (!nm_platform_link_veth_get_properties (NM_PLATFORM_GET, ifindex, &peer_ifindex))
+ peer_ifindex = 0;
- if (!nm_platform_link_veth_get_properties (NM_PLATFORM_GET, nm_device_get_ifindex (device), &peer_ifindex)) {
- _LOGW (LOGD_PLATFORM, "could not read veth properties");
- return NULL;
- }
+ nm_device_parent_set_ifindex (device, peer_ifindex);
- if (peer_ifindex > 0)
- peer = nm_manager_get_device_by_ifindex (nm_manager_get (), peer_ifindex);
- if (peer && NM_IS_DEVICE_VETH (peer)) {
- set_peer (self, peer);
- set_peer (NM_DEVICE_VETH (peer), device);
- }
-
- return priv->peer;
+ peer = nm_device_parent_get_device (device);
+ if ( peer
+ && NM_IS_DEVICE_VETH (peer)
+ && nm_device_parent_get_ifindex (peer) <= 0)
+ update_properties (peer);
}
static gboolean
@@ -115,6 +91,14 @@ can_unmanaged_external_down (NMDevice *self)
return FALSE;
}
+static void
+link_changed (NMDevice *device,
+ const NMPlatformLink *pllink)
+{
+ NM_DEVICE_CLASS (nm_device_veth_parent_class)->link_changed (device, pllink);
+ update_properties (device);
+}
+
/*****************************************************************************/
static void
@@ -123,17 +107,10 @@ nm_device_veth_init (NMDeviceVeth *self)
}
static void
-dispose (GObject *object)
+notify (GObject *object, GParamSpec *pspec)
{
- NMDeviceVeth *self = NM_DEVICE_VETH (object);
- NMDeviceVethPrivate *priv = NM_DEVICE_VETH_GET_PRIVATE (self);
-
- if (priv->peer) {
- g_object_remove_weak_pointer (G_OBJECT (priv->peer), (gpointer *) &priv->peer);
- priv->peer = NULL;
- }
-
- G_OBJECT_CLASS (nm_device_veth_parent_class)->dispose (object);
+ if (nm_streq (pspec->name, NM_DEVICE_PARENT))
+ _notify (NM_DEVICE_VETH (object), PROP_PEER);
}
static void
@@ -145,7 +122,9 @@ get_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_PEER:
- peer = get_peer (self);
+ peer = nm_device_parent_get_device (NM_DEVICE (self));
+ if (peer && !NM_IS_DEVICE_VETH (peer))
+ peer = NULL;
nm_utils_g_value_set_object_path (value, peer);
break;
default:
@@ -163,9 +142,10 @@ nm_device_veth_class_init (NMDeviceVethClass *klass)
NM_DEVICE_CLASS_DECLARE_TYPES (klass, NULL, NM_LINK_TYPE_VETH)
object_class->get_property = get_property;
- object_class->dispose = dispose;
+ object_class->notify = notify;
device_class->can_unmanaged_external_down = can_unmanaged_external_down;
+ device_class->link_changed = link_changed;
obj_properties[PROP_PEER] =
g_param_spec_string (NM_DEVICE_VETH_PEER, "", "",