From 0bbf8c530746c6171aa3a36e2b25a166adf49a04 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 28 Sep 2009 11:09:31 -0700 Subject: [PATCH] ethernet: make initial carrier check synchronous; require carrier for connection takeover (lp#417719) --- src/nm-device-ethernet.c | 24 +++++++++++++++++++++--- src/nm-manager.c | 4 +++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/nm-device-ethernet.c b/src/nm-device-ethernet.c index 1282ff4c70..675f5b813f 100644 --- a/src/nm-device-ethernet.c +++ b/src/nm-device-ethernet.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include "nm-glib-compat.h" @@ -263,6 +263,7 @@ constructor (GType type, caps = nm_device_get_capabilities (self); if (caps & NM_DEVICE_CAP_CARRIER_DETECT) { GError *error = NULL; + guint32 ifflags = 0; /* Only listen to netlink for cards that support carrier detect */ priv->monitor = nm_netlink_monitor_get (); @@ -274,9 +275,26 @@ constructor (GType type, G_CALLBACK (carrier_off), self); + /* Get initial link state */ + if (!nm_netlink_monitor_get_flags_sync (priv->monitor, + priv->ifindex, + &ifflags, + &error)) { + nm_warning ("couldn't get initial carrier state: (%d) %s", + error ? error->code : -1, + (error && error->message) ? error->message : "unknown"); + g_clear_error (&error); + } else + priv->carrier = !!(ifflags & IFF_LOWER_UP); + + /* Request link state again just in case an error occurred getting the + * initial link state. + */ if (!nm_netlink_monitor_request_status (priv->monitor, &error)) { - nm_warning ("couldn't request carrier state: %s", error ? error->message : "unknown"); - g_error_free (error); + nm_warning ("couldn't request carrier state: (%d) %s", + error ? error->code : -1, + (error && error->message) ? error->message : "unknown"); + g_clear_error (&error); } } else { nm_info ("(%s): driver '%s' does not support carrier detection.", diff --git a/src/nm-manager.c b/src/nm-manager.c index 72a01345c5..416df1ac3e 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -1201,6 +1201,7 @@ add_device (NMManager *self, NMDevice *device) NMConnection *existing = NULL; GHashTableIter iter; gpointer value; + gboolean managed = FALSE; priv->devices = g_slist_append (priv->devices, device); @@ -1265,13 +1266,14 @@ add_device (NMManager *self, NMDevice *device) TRUE, existing ? NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED : NM_DEVICE_STATE_REASON_NOW_MANAGED); + managed = TRUE; } nm_sysconfig_settings_device_added (priv->sys_settings, device); g_signal_emit (self, signals[DEVICE_ADDED], 0, device); /* If the device has a connection it can assume, do that now */ - if (existing) { + if (existing && managed && nm_device_is_available (device)) { const char *ac_path; GError *error = NULL;