[NetworkManager/f22] connectivity: fix checking when no valid DNS servers are present (rh #1199098)

Daniel Williams dcbw at fedoraproject.org
Thu Mar 5 14:07:35 UTC 2015


commit dda57934f7da635b691595f63ce9be8cda1c566a
Author: Dan Williams <dcbw at redhat.com>
Date:   Thu Mar 5 08:07:30 2015 -0600

    connectivity: fix checking when no valid DNS servers are present (rh #1199098)

 NetworkManager.spec                 |   7 +-
 bgo742823-connectivity-no-dns.patch | 348 ++++++++++++++++++++++++++++++++++++
 2 files changed, 354 insertions(+), 1 deletion(-)
---
diff --git a/NetworkManager.spec b/NetworkManager.spec
index 1538ab4..6bac5fb 100644
--- a/NetworkManager.spec
+++ b/NetworkManager.spec
@@ -10,7 +10,7 @@
 %define snapshot %{nil}
 %define git_sha %{nil}
 %define realversion 1.0.0
-%define release_version 5
+%define release_version 6
 %define epoch_version 1
 
 %define obsoletes_nmver 1:0.9.9.95-1
@@ -85,6 +85,7 @@ Patch1: 0001-rh1116999-resolv-conf-symlink.patch
 Patch2: NetworkManager-1.0.0-bridge_resume.patch
 
 Patch3: 0001-ip6-config-remove-the-link-local-address-on-address-.patch
+Patch4: bgo742823-connectivity-no-dns.patch
 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
@@ -371,6 +372,7 @@ by nm-connection-editor and nm-applet in a non-graphical environment.
 %patch1 -p1 -b .0001-rh1116999-resolv-conf-symlink.orig
 %patch2 -p1 -b .bridge_resume
 %patch3 -p1 -b .v6ll-flush
+%patch4 -p1 -b .bgo742823-connectivity-no-dns.orig
 
 %build
 
@@ -663,6 +665,9 @@ fi
 %endif
 
 %changelog
+* Thu Mar  5 2015 Dan Williams <dcbw at redhat.com> - 1:1.0.0-6
+- connectivity: fix checking when no valid DNS servers are present (rh #1199098)
+
 * Wed Mar  4 2015 Dan Williams <dcbw at redhat.com> - 1:1.0.0-5
 - core: flush IPv6LL address when deconfiguring managed devices (rh #1193127) (rh #1184997)
 
diff --git a/bgo742823-connectivity-no-dns.patch b/bgo742823-connectivity-no-dns.patch
new file mode 100644
index 0000000..44efa5a
--- /dev/null
+++ b/bgo742823-connectivity-no-dns.patch
@@ -0,0 +1,348 @@
+From 0a22ce64a6a8c2ec0f8a71f1a59855593cdeb96a Mon Sep 17 00:00:00 2001
+From: Dan Winship <danw at redhat.com>
+Date: Tue, 13 Jan 2015 15:08:21 -0500
+Subject: [PATCH 1/4] connectivity: improve debug logging
+
+nm-connectivity was logging both "started" and "finished" for periodic
+connectivity checks, but was only logging "finished" for manual ones,
+which made the logs look weird. Fix it to log both periodic and manual
+starts, and differentiate them.
+
+Also add some additional logging to indicate when set_online() is
+called, and when :state changes.
+
+(cherry picked from commit 53f2642c736ebb8466cbfd29c2ede2c3828a4728)
+---
+ src/nm-connectivity.c | 31 ++++++++++++++++++++++++++++++-
+ 1 file changed, 30 insertions(+), 1 deletion(-)
+
+diff --git a/src/nm-connectivity.c b/src/nm-connectivity.c
+index 8a324a5..5913fd9 100644
+--- a/src/nm-connectivity.c
++++ b/src/nm-connectivity.c
+@@ -69,12 +69,33 @@ nm_connectivity_get_state (NMConnectivity *connectivity)
+ 	return NM_CONNECTIVITY_GET_PRIVATE (connectivity)->state;
+ }
+ 
++static const char *
++state_name (NMConnectivityState state)
++{
++	switch (state) {
++	case NM_CONNECTIVITY_UNKNOWN:
++		return "UNKNOWN";
++	case NM_CONNECTIVITY_NONE:
++		return "NONE";
++	case NM_CONNECTIVITY_LIMITED:
++		return "LIMITED";
++	case NM_CONNECTIVITY_PORTAL:
++		return "PORTAL";
++	case NM_CONNECTIVITY_FULL:
++		return "FULL";
++	default:
++		return "???";
++	}
++}
++
+ static void
+ update_state (NMConnectivity *self, NMConnectivityState state)
+ {
+ 	NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
+ 
+ 	if (priv->state != state) {
++		nm_log_dbg (LOGD_CONCHECK, "Connectivity state changed from %s to %s",
++		            state_name (priv->state), state_name (state));
+ 		priv->state = state;
+ 		g_object_notify (G_OBJECT (self), NM_CONNECTIVITY_STATE);
+ 	}
+@@ -155,7 +176,6 @@ run_check (gpointer user_data)
+ 
+ 	nm_connectivity_check_async (self, run_check_complete, NULL);
+ 	priv->running = TRUE;
+-	nm_log_dbg (LOGD_CONCHECK, "Connectivity check with uri '%s' started.", priv->uri);
+ 
+ 	return TRUE;
+ }
+@@ -167,7 +187,11 @@ nm_connectivity_set_online (NMConnectivity *self,
+ {
+ #if WITH_CONCHECK
+ 	NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
++#endif
+ 
++	nm_log_dbg (LOGD_CONCHECK, "nm_connectivity_set_online(%s)", online ? "TRUE" : "FALSE");
++
++#if WITH_CONCHECK
+ 	if (online && priv->uri && priv->interval) {
+ 		if (!priv->check_id)
+ 			priv->check_id = g_timeout_add_seconds (priv->interval, run_check, self);
+@@ -201,6 +225,11 @@ nm_connectivity_check_async (NMConnectivity      *self,
+ 	g_return_if_fail (NM_IS_CONNECTIVITY (self));
+ 	priv = NM_CONNECTIVITY_GET_PRIVATE (self);
+ 
++	if (callback == run_check_complete)
++		nm_log_dbg (LOGD_CONCHECK, "Periodic connectivity check started with uri '%s'.", priv->uri);
++	else
++		nm_log_dbg (LOGD_CONCHECK, "Connectivity check started with uri '%s'.", priv->uri);
++
+ 	simple = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
+ 	                                    nm_connectivity_check_async);
+ 
+-- 
+2.1.0
+
+From e042bb09a56511ffc6040f8e125863ebb5623974 Mon Sep 17 00:00:00 2001
+From: Dan Winship <danw at redhat.com>
+Date: Tue, 13 Jan 2015 14:48:29 -0500
+Subject: [PATCH 2/4] connectivity: fix manager state during connectivity check
+ (bgo #742823)
+
+When a connection has finished activating, but we don't know yet that
+we have full connectivity, then find_best_device_state() should return
+CONNECTED_SITE, not CONNECTING. Fixes a bug where the manager state
+would repeatedly switch between those two states.
+
+(cherry picked from commit 5e182d55777b95886d39068821d1d6fa8298474d)
+---
+ src/nm-manager.c | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 65fb568..fb4e016 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -578,7 +578,7 @@ checked_connectivity (GObject *object, GAsyncResult *result, gpointer user_data)
+ }
+ 
+ static NMState
+-find_best_device_state (NMManager *manager, gboolean *want_connectivity_check)
++find_best_device_state (NMManager *manager)
+ {
+ 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
+ 	NMState best_state = NM_STATE_DISCONNECTED;
+@@ -593,13 +593,10 @@ find_best_device_state (NMManager *manager, gboolean *want_connectivity_check)
+ 			if (   nm_active_connection_get_default (ac)
+ 			    || nm_active_connection_get_default6 (ac)) {
+ 				nm_connectivity_set_online (priv->connectivity, TRUE);
+-				if (nm_connectivity_get_state (priv->connectivity) == NM_CONNECTIVITY_FULL) {
+-					*want_connectivity_check = FALSE;
++				if (nm_connectivity_get_state (priv->connectivity) == NM_CONNECTIVITY_FULL)
+ 					return NM_STATE_CONNECTED_GLOBAL;
+-				}
+ 
+-				best_state = NM_STATE_CONNECTING;
+-				*want_connectivity_check = TRUE;
++				best_state = NM_STATE_CONNECTED_SITE;
+ 			} else {
+ 				if (best_state < NM_STATE_CONNECTING)
+ 					best_state = NM_STATE_CONNECTED_LOCAL;
+@@ -630,7 +627,6 @@ nm_manager_update_state (NMManager *manager)
+ {
+ 	NMManagerPrivate *priv;
+ 	NMState new_state = NM_STATE_DISCONNECTED;
+-	gboolean want_connectivity_check = FALSE;
+ 
+ 	g_return_if_fail (NM_IS_MANAGER (manager));
+ 
+@@ -639,9 +635,9 @@ nm_manager_update_state (NMManager *manager)
+ 	if (manager_sleeping (manager))
+ 		new_state = NM_STATE_ASLEEP;
+ 	else
+-		new_state = find_best_device_state (manager, &want_connectivity_check);
++		new_state = find_best_device_state (manager);
+ 
+-	if (new_state == NM_STATE_CONNECTING && want_connectivity_check) {
++	if (new_state == NM_STATE_CONNECTED_SITE) {
+ 		nm_connectivity_check_async (priv->connectivity,
+ 		                             checked_connectivity,
+ 		                             g_object_ref (manager));
+-- 
+2.1.0
+
+From 57249a2d0513a51e7446b7058f9e24e69cabbf6c Mon Sep 17 00:00:00 2001
+From: Dan Winship <danw at redhat.com>
+Date: Tue, 13 Jan 2015 15:35:10 -0500
+Subject: [PATCH 3/4] connectivity: simplify redundant code
+
+Merge the two nm_connectivity_set_online() calls into one, after
+tweaking NMConnectivity to always update its internal state before
+alerting callers to the new state.
+
+(cherry picked from commit 0997c4b245ca5638d0d27eee90146dc47c56130d)
+---
+ src/nm-connectivity.c | 4 ++--
+ src/nm-manager.c      | 6 +++---
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/nm-connectivity.c b/src/nm-connectivity.c
+index 5913fd9..cf4552a 100644
+--- a/src/nm-connectivity.c
++++ b/src/nm-connectivity.c
+@@ -145,10 +145,10 @@ nm_connectivity_check_cb (SoupSession *session, SoupMessage *msg, gpointer user_
+ 	}
+ 
+  done:
++	update_state (self, new_state);
++
+ 	g_simple_async_result_set_op_res_gssize (simple, new_state);
+ 	g_simple_async_result_complete (simple);
+-
+-	update_state (self, new_state);
+ }
+ 
+ static void
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index fb4e016..62a1e15 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -592,7 +592,6 @@ find_best_device_state (NMManager *manager)
+ 		case NM_ACTIVE_CONNECTION_STATE_ACTIVATED:
+ 			if (   nm_active_connection_get_default (ac)
+ 			    || nm_active_connection_get_default6 (ac)) {
+-				nm_connectivity_set_online (priv->connectivity, TRUE);
+ 				if (nm_connectivity_get_state (priv->connectivity) == NM_CONNECTIVITY_FULL)
+ 					return NM_STATE_CONNECTED_GLOBAL;
+ 
+@@ -637,12 +636,13 @@ nm_manager_update_state (NMManager *manager)
+ 	else
+ 		new_state = find_best_device_state (manager);
+ 
++	nm_connectivity_set_online (priv->connectivity, new_state >= NM_STATE_CONNECTED_LOCAL);
++
+ 	if (new_state == NM_STATE_CONNECTED_SITE) {
+ 		nm_connectivity_check_async (priv->connectivity,
+ 		                             checked_connectivity,
+ 		                             g_object_ref (manager));
+-	} else
+-		nm_connectivity_set_online (priv->connectivity, new_state >= NM_STATE_CONNECTED_LOCAL);
++	}
+ 
+ 	set_state (manager, new_state);
+ }
+-- 
+2.1.0
+
+From 3d49585b377a578ce0195d74c5b5125a1101c688 Mon Sep 17 00:00:00 2001
+From: Dan Winship <danw at redhat.com>
+Date: Tue, 13 Jan 2015 15:25:31 -0500
+Subject: [PATCH 4/4] connectivity: avoid redundant connectivity checks
+
+Don't start an automatic connectivity check right when NMManager tells
+us we're online; only do it if the manager doesn't request an explicit
+connectivity check immediately afterward.
+
+(cherry picked from commit 66b8f2b7a0f9e1ce84d8a98863c88ea3dbed0a51)
+---
+ src/nm-connectivity.c | 26 +++++++++++++++++---------
+ 1 file changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/src/nm-connectivity.c b/src/nm-connectivity.c
+index cf4552a..1a374eb 100644
+--- a/src/nm-connectivity.c
++++ b/src/nm-connectivity.c
+@@ -44,7 +44,7 @@ typedef struct {
+ 
+ #if WITH_CONCHECK
+ 	SoupSession *soup_session;
+-	gboolean running;
++	guint pending_checks;
+ 	guint check_id;
+ #endif
+ 
+@@ -114,6 +114,7 @@ nm_connectivity_check_cb (SoupSession *session, SoupMessage *msg, gpointer user_
+ 	self = NM_CONNECTIVITY (g_async_result_get_source_object (G_ASYNC_RESULT (simple)));
+ 	g_object_unref (self);
+ 	priv = NM_CONNECTIVITY_GET_PRIVATE (self);
++	priv->pending_checks--;
+ 
+ 	if (SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)) {
+ 		nm_log_info (LOGD_CONCHECK, "Connectivity check for uri '%s' failed with '%s'.",
+@@ -157,11 +158,9 @@ run_check_complete (GObject      *object,
+                     gpointer      user_data)
+ {
+ 	NMConnectivity *self = NM_CONNECTIVITY (object);
+-	NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
+ 	GError *error = NULL;
+ 
+ 	nm_connectivity_check_finish (self, result, &error);
+-	priv->running = FALSE;
+ 	if (error) {
+ 		nm_log_err (LOGD_CONCHECK, "Connectivity check failed: %s", error->message);
+ 		g_error_free (error);
+@@ -172,13 +171,23 @@ static gboolean
+ run_check (gpointer user_data)
+ {
+ 	NMConnectivity *self = NM_CONNECTIVITY (user_data);
+-	NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
+ 
+ 	nm_connectivity_check_async (self, run_check_complete, NULL);
+-	priv->running = TRUE;
+-
+ 	return TRUE;
+ }
++
++static gboolean
++idle_start_periodic_checks (gpointer user_data)
++{
++	NMConnectivity *self = user_data;
++	NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
++
++	priv->check_id = g_timeout_add_seconds (priv->interval, run_check, self);
++	if (!priv->pending_checks)
++		run_check (self);
++
++	return FALSE;
++}
+ #endif
+ 
+ void
+@@ -194,9 +203,7 @@ nm_connectivity_set_online (NMConnectivity *self,
+ #if WITH_CONCHECK
+ 	if (online && priv->uri && priv->interval) {
+ 		if (!priv->check_id)
+-			priv->check_id = g_timeout_add_seconds (priv->interval, run_check, self);
+-		if (!priv->running)
+-			run_check (self);
++			priv->check_id = g_timeout_add (0, idle_start_periodic_checks, self);
+ 
+ 		return;
+ 	} else if (priv->check_id) {
+@@ -241,6 +248,7 @@ nm_connectivity_check_async (NMConnectivity      *self,
+ 		                            msg,
+ 		                            nm_connectivity_check_cb,
+ 		                            simple);
++		priv->pending_checks++;
+ 
+ 		return;
+ 	}
+-- 
+2.1.0
+
+From ecd7227d45fc517230073d48a68a51937b60daea Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller at redhat.com>
+Date: Fri, 16 Jan 2015 14:15:24 +0100
+Subject: [PATCH] connectivity: fix compile error no WITH_CONCHECK
+
+Fixes: 53f2642c736ebb8466cbfd29c2ede2c3828a4728
+(cherry picked from commit 07be0f511d6d559431ea66bdf74b00e4c276904b)
+---
+ src/nm-connectivity.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/nm-connectivity.c b/src/nm-connectivity.c
+index 1a374eb..f35da5e 100644
+--- a/src/nm-connectivity.c
++++ b/src/nm-connectivity.c
+@@ -232,9 +232,11 @@ nm_connectivity_check_async (NMConnectivity      *self,
+ 	g_return_if_fail (NM_IS_CONNECTIVITY (self));
+ 	priv = NM_CONNECTIVITY_GET_PRIVATE (self);
+ 
++#if WITH_CONCHECK
+ 	if (callback == run_check_complete)
+ 		nm_log_dbg (LOGD_CONCHECK, "Periodic connectivity check started with uri '%s'.", priv->uri);
+ 	else
++#endif
+ 		nm_log_dbg (LOGD_CONCHECK, "Connectivity check started with uri '%s'.", priv->uri);
+ 
+ 	simple = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
+-- 
+2.1.0
+


More information about the scm-commits mailing list