Re: Getting NM to re-try DHCP
- From: Jirka Klimes <jklimes redhat com>
- To: networkmanager-list gnome org
- Subject: Re: Getting NM to re-try DHCP
- Date: Fri, 20 May 2011 14:05:42 +0200
On Thursday 07 of April 2011 00:24:44 Dan Williams wrote:
> On Tue, 2011-04-05 at 11:37 -0400, Derek Atkins wrote:
> > Hey all,
> >
> > I have a strange issue. I lost power last night and one of my systems
> > came up before my DHCP server did (which is surprising, because my DHCP
> > server usually comes up pretty quick!) This "client" system was
> > supposed to get itself on the network (it has an auto-logon system).
> > However, NM didn't succeed because my DHCP server wasn't responding,
> > yet.
> >
> > This is a hard-wired system (not wireless). Is there any way to get NM
> > to periodically retry DHCP if at first it does not succeed?
> >
> > I realize that DHCP has its own retry mechanism, but if the whole
> > process times out, can I set NM to retry every, say, 5 minutes?
>
> We'd need some code changes in NM; basically for wired connections if
> the activation attempt fails a certain number of times (currently 3)
> then the connection is marked "invalid". What probably should happen is
> that internally, in nm-policy.c, a timeout handler should be scheduled
> for the connection (using g_timeout_add_seconds()) that triggers after 5
> minutes or so and if the connection isn't currently active (ie check the
> NMManager's active connection list) then the invalid flag is cleared
> from the connection, which will let it be automatically retried.
>
> It's pretty simple from a code perspective, just hasn't been done yet in
> the run-up to 0.9 and 0.8.4. Any takers?
>
> Dan
A patch doing that is in the attachment.
Jirka
From d3e1968ff94e735a0761036cb795cbee4c06937e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes redhat com>
Date: Fri, 20 May 2011 13:45:12 +0200
Subject: [PATCH] policy: remove connection "invalid mark" after 5 mins to
auto-activate again
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When there is a temporary connection failure (e.g. due to unavailable DHCP),
auto-activated connection is marked as invalid after several retries. Reset the
flag after 5 mins to allow next auto-reconnection.
Signed-off-by: Jiří Klimeš <jklimes redhat com>
---
src/nm-policy.c | 56 ++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 45 insertions(+), 11 deletions(-)
diff --git a/src/nm-policy.c b/src/nm-policy.c
index 194d111..5b13fff 100644
--- a/src/nm-policy.c
+++ b/src/nm-policy.c
@@ -72,6 +72,7 @@ struct NMPolicy {
#define RETRIES_TAG "autoconnect-retries"
#define RETRIES_DEFAULT 4
+#define RESET_RETRIES_TIMEOUT 300
static NMDevice *
get_best_ip4_device (NMManager *manager, NMActRequest **out_req)
@@ -864,6 +865,38 @@ schedule_activate_check (NMPolicy *policy, NMDevice *device, guint delay_seconds
}
}
+static void
+schedule_activate_all (NMPolicy *policy)
+{
+ GSList *iter, *devices;
+
+ devices = nm_manager_get_devices (policy->manager);
+ for (iter = devices; iter; iter = g_slist_next (iter))
+ schedule_activate_check (policy, NM_DEVICE (iter->data), 0);
+}
+
+typedef struct {
+ NMConnection *connection;
+ NMPolicy *policy;
+} ResetRetriesData;
+
+static gboolean
+reset_connection_retries (gpointer user_data)
+{
+ ResetRetriesData *data = (ResetRetriesData *) user_data;
+ NMConnection *connection = NM_CONNECTION (data->connection);
+ NMPolicy *policy = (NMPolicy *) data->policy;
+
+ /* If the connection is still invalid, reset auto retries back to default */
+ if (get_connection_auto_retries (connection) == 0)
+ set_connection_auto_retries (connection, RETRIES_DEFAULT);
+
+ schedule_activate_all (policy);
+
+ g_free (user_data);
+ return FALSE;
+}
+
static NMConnection *
get_device_connection (NMDevice *device)
{
@@ -908,8 +941,19 @@ device_state_changed (NMDevice *device,
set_connection_auto_retries (connection, tries - 1);
}
- if (get_connection_auto_retries (connection) == 0)
+ if (get_connection_auto_retries (connection) == 0) {
+ ResetRetriesData *reset_data;
+
nm_log_info (LOGD_DEVICE, "Marking connection '%s' invalid.", nm_connection_get_id (connection));
+
+ reset_data = g_malloc0 (sizeof (ResetRetriesData));
+ reset_data->connection = connection;
+ reset_data->policy = policy;
+
+ /* Schedule timeout for resetting RETRIES_TAG so that the connection can be auto-activated again.
+ * That handles e.g. temporary unavailable DHCP server, and such cases. */
+ g_timeout_add_seconds (RESET_RETRIES_TIMEOUT, reset_connection_retries, reset_data);
+ }
nm_connection_clear_secrets (connection);
}
schedule_activate_check (policy, device, 3);
@@ -1032,16 +1076,6 @@ device_removed (NMManager *manager, NMDevice *device, gpointer user_data)
}
static void
-schedule_activate_all (NMPolicy *policy)
-{
- GSList *iter, *devices;
-
- devices = nm_manager_get_devices (policy->manager);
- for (iter = devices; iter; iter = g_slist_next (iter))
- schedule_activate_check (policy, NM_DEVICE (iter->data), 0);
-}
-
-static void
connection_added (NMSettings *settings,
NMConnection *connection,
gpointer user_data)
--
1.7.5.1
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]