Blame SOURCES/gnetworkmonitornm.patch

aea50f
From c48c984d39afeae84b0cad515f08f83c711fd9c4 Mon Sep 17 00:00:00 2001
aea50f
From: Philip Withnall <withnall@endlessm.com>
aea50f
Date: Thu, 13 Sep 2018 10:25:05 +0100
aea50f
Subject: [PATCH 1/9] gnetworkmonitornm: Set a GError properly on an error
aea50f
 handling path
aea50f
MIME-Version: 1.0
aea50f
Content-Type: text/plain; charset=UTF-8
aea50f
Content-Transfer-Encoding: 8bit
aea50f
aea50f
All the other initialisation failure paths set a GError, but this one
aea50f
didn’t. Set a GError to avoid breaking the invariant that returning
aea50f
FALSE should always have a GError set.
aea50f
aea50f
Signed-off-by: Philip Withnall <withnall@endlessm.com>
aea50f
aea50f
https://gitlab.gnome.org/GNOME/glib/issues/1523
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 2 ++
aea50f
 1 file changed, 2 insertions(+)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 20a86571f..5bc8c925a 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -309,6 +309,8 @@ g_network_monitor_nm_initable_init (GInitable     *initable,
aea50f
 
aea50f
   if (!name_owner)
aea50f
     {
aea50f
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
aea50f
+                   _("NetworkManager not running"));
aea50f
       g_object_unref (proxy);
aea50f
       return FALSE;
aea50f
     }
aea50f
-- 
aea50f
2.33.1
aea50f
aea50f
From d139986b1f213a7e1c1e3968ad2d8270f820bd57 Mon Sep 17 00:00:00 2001
aea50f
From: Antonio Larrosa <alarrosa@suse.com>
aea50f
Date: Tue, 12 Mar 2019 18:35:10 +0100
aea50f
Subject: [PATCH 2/9] Handle an UNKNOWN NetworkManager connectivity as NONE
aea50f
aea50f
nm_conn_to_g_conn already handles UNKNOWN like NONE (returning
aea50f
G_NETWORK_CONNECTIVITY_LOCAL in both cases). So in sync_properties
aea50f
we should also set new_connectivity to G_NETWORK_CONNECTIVITY_LOCAL
aea50f
for both NM_CONNECTIVITY_UNKNOWN and NM_CONNECTIVITY_NONE.
aea50f
aea50f
This has the added benefit that when NetworkManager returns the network
aea50f
connectivity is UNKNOWN, we set network_available to FALSE as it should
aea50f
be. Previously, there were cases in a laptop with no network access,
aea50f
that g_network_monitor_get_network_available returned true, which was
aea50f
wrong and is also fixed with this commit.
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 3 ++-
aea50f
 1 file changed, 2 insertions(+), 1 deletion(-)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 5bc8c925a..4e2a35e8a 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -167,7 +167,8 @@ sync_properties (GNetworkMonitorNM *nm,
aea50f
   nm_connectivity = g_variant_get_uint32 (v);
aea50f
   g_variant_unref (v);
aea50f
 
aea50f
-  if (nm_connectivity == NM_CONNECTIVITY_NONE)
aea50f
+  if (nm_connectivity == NM_CONNECTIVITY_UNKNOWN ||
aea50f
+      nm_connectivity == NM_CONNECTIVITY_NONE)
aea50f
     {
aea50f
       new_network_available = FALSE;
aea50f
       new_network_metered = FALSE;
aea50f
-- 
aea50f
2.33.1
aea50f
aea50f
From 5b4e6f9813cf90c690d8974635b0aeff8f5d2c5d Mon Sep 17 00:00:00 2001
aea50f
From: Fabrice Bellet <fabrice@bellet.info>
aea50f
Date: Mon, 29 Apr 2019 12:05:54 +0000
aea50f
Subject: [PATCH 3/9] gnetworkmonitornm: Fix network available detection
aea50f
aea50f
The network-available property can be asserted by querying the NMState
aea50f
describing the current overval network state, instead of the
aea50f
NMConnectivityState. The advantage of the NMState is that is reflects
aea50f
immediately the network state modification, while the connectivity
aea50f
state is tested at a fixed frequency.
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 39 ++++++++++++++++++++++++++++++++++++---
aea50f
 1 file changed, 36 insertions(+), 3 deletions(-)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 4e2a35e8a..7bb480f54 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -52,6 +52,19 @@ typedef enum {
aea50f
   NM_CONNECTIVITY_FULL
aea50f
 } NMConnectivityState;
aea50f
 
aea50f
+/* Copied from https://developer.gnome.org/libnm-util/stable/libnm-util-NetworkManager.html#NMState;
aea50f
+ * used inline to avoid a NetworkManager dependency from GLib. */
aea50f
+typedef enum {
aea50f
+  NM_STATE_UNKNOWN          = 0,
aea50f
+  NM_STATE_ASLEEP           = 10,
aea50f
+  NM_STATE_DISCONNECTED     = 20,
aea50f
+  NM_STATE_DISCONNECTING    = 30,
aea50f
+  NM_STATE_CONNECTING       = 40,
aea50f
+  NM_STATE_CONNECTED_LOCAL  = 50,
aea50f
+  NM_STATE_CONNECTED_SITE   = 60,
aea50f
+  NM_STATE_CONNECTED_GLOBAL = 70,
aea50f
+} NMState;
aea50f
+
aea50f
 struct _GNetworkMonitorNMPrivate
aea50f
 {
aea50f
   GDBusProxy *proxy;
aea50f
@@ -155,11 +168,19 @@ sync_properties (GNetworkMonitorNM *nm,
aea50f
                  gboolean           emit_signals)
aea50f
 {
aea50f
   GVariant *v;
aea50f
+  NMState nm_state;
aea50f
   NMConnectivityState nm_connectivity;
aea50f
   gboolean new_network_available;
aea50f
   gboolean new_network_metered;
aea50f
   GNetworkConnectivity new_connectivity;
aea50f
 
aea50f
+  v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "State");
aea50f
+  if (!v)
aea50f
+    return;
aea50f
+
aea50f
+  nm_state = g_variant_get_uint32 (v);
aea50f
+  g_variant_unref (v);
aea50f
+
aea50f
   v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "Connectivity");
aea50f
   if (!v)
aea50f
     return;
aea50f
@@ -167,14 +188,26 @@ sync_properties (GNetworkMonitorNM *nm,
aea50f
   nm_connectivity = g_variant_get_uint32 (v);
aea50f
   g_variant_unref (v);
aea50f
 
aea50f
-  if (nm_connectivity == NM_CONNECTIVITY_UNKNOWN ||
aea50f
-      nm_connectivity == NM_CONNECTIVITY_NONE)
aea50f
+  if (nm_state <= NM_STATE_CONNECTED_LOCAL)
aea50f
     {
aea50f
       new_network_available = FALSE;
aea50f
       new_network_metered = FALSE;
aea50f
       new_connectivity = G_NETWORK_CONNECTIVITY_LOCAL;
aea50f
     }
aea50f
-  else
aea50f
+  else if (nm_state <= NM_STATE_CONNECTED_SITE)
aea50f
+    {
aea50f
+      new_network_available = FALSE;
aea50f
+      new_network_metered = FALSE;
aea50f
+      if (nm_connectivity == NM_CONNECTIVITY_PORTAL)
aea50f
+        {
aea50f
+          new_connectivity = G_NETWORK_CONNECTIVITY_PORTAL;
aea50f
+        }
aea50f
+      else
aea50f
+        {
aea50f
+          new_connectivity = G_NETWORK_CONNECTIVITY_LIMITED;
aea50f
+        }
aea50f
+    }
aea50f
+  else /* nm_state == NM_STATE_CONNECTED_FULL */
aea50f
     {
aea50f
 
aea50f
       /* this is only available post NM 1.0 */
aea50f
-- 
aea50f
2.33.1
aea50f
aea50f
From 96fba295771d600e4f0f522400b2fb9b1ff42cee Mon Sep 17 00:00:00 2001
aea50f
From: Philip Withnall <withnall@endlessm.com>
aea50f
Date: Fri, 31 May 2019 11:19:07 +0100
aea50f
Subject: [PATCH 4/9] gnetworkmonitornm: Consider NM_STATE_CONNECTED_SITE to be
aea50f
 available
aea50f
aea50f
`NM_STATE_CONNECTED_SITE` is documented to mean that a default route is
aea50f
available, but that the internet connectivity check failed. A default
aea50f
route being available is compatible with the documentation for
aea50f
GNetworkMonitor:network-available, which should be true if the system
aea50f
has a default route for at least one of IPv4 and IPv6.
aea50f
aea50f
https://developer.gnome.org/NetworkManager/stable/nm-dbus-types.html
aea50f
aea50f
Signed-off-by: Philip Withnall <withnall@endlessm.com>
aea50f
aea50f
Fixes: #1788
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 2 +-
aea50f
 1 file changed, 1 insertion(+), 1 deletion(-)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 7bb480f54..9013fd49c 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -196,7 +196,7 @@ sync_properties (GNetworkMonitorNM *nm,
aea50f
     }
aea50f
   else if (nm_state <= NM_STATE_CONNECTED_SITE)
aea50f
     {
aea50f
-      new_network_available = FALSE;
aea50f
+      new_network_available = TRUE;
aea50f
       new_network_metered = FALSE;
aea50f
       if (nm_connectivity == NM_CONNECTIVITY_PORTAL)
aea50f
         {
aea50f
-- 
aea50f
2.33.1
aea50f
aea50f
From 74e5f472c838115f0ba19ac501805cb5b2ca837f Mon Sep 17 00:00:00 2001
aea50f
From: Bastien Nocera <hadess@hadess.net>
aea50f
Date: Mon, 29 Jul 2019 17:25:21 +0200
aea50f
Subject: [PATCH 5/9] gnetworkmonitornm: Disconnect g-signal from proxy
aea50f
aea50f
So that we're sure never to receive a signal if something is keeping the
aea50f
proxy alive.
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 12 ++++++++++--
aea50f
 1 file changed, 10 insertions(+), 2 deletions(-)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 9013fd49c..52073fac9 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -68,6 +68,7 @@ typedef enum {
aea50f
 struct _GNetworkMonitorNMPrivate
aea50f
 {
aea50f
   GDBusProxy *proxy;
aea50f
+  guint signal_id;
aea50f
 
aea50f
   GNetworkConnectivity connectivity;
aea50f
   gboolean network_available;
aea50f
@@ -360,8 +361,8 @@ g_network_monitor_nm_initable_init (GInitable     *initable,
aea50f
       return FALSE;
aea50f
     }
aea50f
 
aea50f
-  g_signal_connect (G_OBJECT (proxy), "g-signal",
aea50f
-                    G_CALLBACK (proxy_signal_cb), nm);
aea50f
+  nm->priv->signal_id = g_signal_connect (G_OBJECT (proxy), "g-signal",
aea50f
+                                          G_CALLBACK (proxy_signal_cb), nm);
aea50f
   nm->priv->proxy = proxy;
aea50f
   sync_properties (nm, FALSE);
aea50f
 
aea50f
@@ -373,6 +374,13 @@ g_network_monitor_nm_finalize (GObject *object)
aea50f
 {
aea50f
   GNetworkMonitorNM *nm = G_NETWORK_MONITOR_NM (object);
aea50f
 
aea50f
+  if (nm->priv->proxy != NULL &&
aea50f
+      nm->priv->signal_id != 0)
aea50f
+    {
aea50f
+      g_signal_handler_disconnect (nm->priv->proxy,
aea50f
+                                   nm->priv->signal_id);
aea50f
+      nm->priv->signal_id = 0;
aea50f
+    }
aea50f
   g_clear_object (&nm->priv->proxy);
aea50f
 
aea50f
   G_OBJECT_CLASS (g_network_monitor_nm_parent_class)->finalize (object);
aea50f
-- 
aea50f
2.33.1
aea50f
aea50f
From eeaf1de6e695afd971d67137caa8e39e1c1267df Mon Sep 17 00:00:00 2001
aea50f
From: Bastien Nocera <hadess@hadess.net>
aea50f
Date: Mon, 29 Jul 2019 17:26:20 +0200
aea50f
Subject: [PATCH 6/9] gnetworkmonitornm: Arguments to g-signal's callback are
aea50f
 const
aea50f
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 4 ++--
aea50f
 1 file changed, 2 insertions(+), 2 deletions(-)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 52073fac9..479653a51 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -268,8 +268,8 @@ update_cached_property (GDBusProxy   *proxy,
aea50f
 
aea50f
 static void
aea50f
 proxy_signal_cb (GDBusProxy        *proxy,
aea50f
-                 gchar             *sender_name,
aea50f
-                 gchar             *signal_name,
aea50f
+                 const gchar       *sender_name,
aea50f
+                 const gchar       *signal_name,
aea50f
                  GVariant          *parameters,
aea50f
                  GNetworkMonitorNM *nm)
aea50f
 {
aea50f
-- 
aea50f
2.33.1
aea50f
aea50f
From 46d70700c85e4419942c8a3d08bd0bf842702c4a Mon Sep 17 00:00:00 2001
aea50f
From: Bastien Nocera <hadess@hadess.net>
aea50f
Date: Mon, 29 Jul 2019 17:26:47 +0200
aea50f
Subject: [PATCH 7/9] gnetworkmonitornm: Remove double-space
aea50f
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 2 +-
aea50f
 1 file changed, 1 insertion(+), 1 deletion(-)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 479653a51..5a36a0ba1 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -391,7 +391,7 @@ g_network_monitor_nm_class_init (GNetworkMonitorNMClass *nl_class)
aea50f
 {
aea50f
   GObjectClass *gobject_class = G_OBJECT_CLASS (nl_class);
aea50f
 
aea50f
-  gobject_class->finalize  = g_network_monitor_nm_finalize;
aea50f
+  gobject_class->finalize = g_network_monitor_nm_finalize;
aea50f
   gobject_class->get_property = g_network_monitor_nm_get_property;
aea50f
 
aea50f
   g_object_class_override_property (gobject_class, PROP_NETWORK_AVAILABLE, "network-available");
aea50f
-- 
aea50f
2.33.1
aea50f
aea50f
From 72291aac3dac7a8ed4c85eb41608f3f5f9ad7681 Mon Sep 17 00:00:00 2001
aea50f
From: Julian Andres Klode <julian.klode@canonical.com>
aea50f
Date: Tue, 12 Oct 2021 12:01:50 +0200
aea50f
Subject: [PATCH 8/9] gnetworkmonitornm: Stop using removed PropertiesChanged
aea50f
 signal
aea50f
aea50f
Use the org.freedesktop.DBus.Properties interface to listen
aea50f
to PropertiesChanged signals on /org/freedesktop/NetworkManager.
aea50f
aea50f
NetworkManager used to provide its own legacy PropertiesChanged
aea50f
signal, but that was dropped in
aea50f
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/853
aea50f
aea50f
This requires NetworkManager >= 1.2 (2016)
aea50f
aea50f
Fixes: #2505
aea50f
Bug-Ubuntu: https://bugs.launchpad.net/bugs/1946196
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 29 +++++++----------------------
aea50f
 1 file changed, 7 insertions(+), 22 deletions(-)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 5a36a0ba1..6a6d1d666 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -267,29 +267,14 @@ update_cached_property (GDBusProxy   *proxy,
aea50f
 }
aea50f
 
aea50f
 static void
aea50f
-proxy_signal_cb (GDBusProxy        *proxy,
aea50f
-                 const gchar       *sender_name,
aea50f
-                 const gchar       *signal_name,
aea50f
-                 GVariant          *parameters,
aea50f
-                 GNetworkMonitorNM *nm)
aea50f
+proxy_properties_changed_cb (GDBusProxy        *proxy,
aea50f
+                             GVariant          *changed_properties,
aea50f
+                             GStrv              invalidated_properties,
aea50f
+                             GNetworkMonitorNM *nm)
aea50f
 {
aea50f
-  GVariant *asv;
aea50f
   GVariantDict *dict;
aea50f
 
aea50f
-  if (g_strcmp0 (signal_name, "PropertiesChanged") != 0)
aea50f
-    return;
aea50f
-
aea50f
-  g_variant_get (parameters, "(@a{sv})", &asv;;
aea50f
-  if (!asv)
aea50f
-    return;
aea50f
-
aea50f
-  dict = g_variant_dict_new (asv);
aea50f
-  g_variant_unref (asv);
aea50f
-  if (!dict)
aea50f
-    {
aea50f
-      g_warning ("Failed to handle PropertiesChanged signal from NetworkManager");
aea50f
-      return;
aea50f
-    }
aea50f
+  dict = g_variant_dict_new (changed_properties);
aea50f
 
aea50f
   update_cached_property (nm->priv->proxy, "Connectivity", dict);
aea50f
 
aea50f
@@ -361,8 +346,8 @@ g_network_monitor_nm_initable_init (GInitable     *initable,
aea50f
       return FALSE;
aea50f
     }
aea50f
 
aea50f
-  nm->priv->signal_id = g_signal_connect (G_OBJECT (proxy), "g-signal",
aea50f
-                                          G_CALLBACK (proxy_signal_cb), nm);
aea50f
+  nm->priv->signal_id = g_signal_connect (G_OBJECT (proxy), "g-properties-changed",
aea50f
+                                          G_CALLBACK (proxy_properties_changed_cb), nm);
aea50f
   nm->priv->proxy = proxy;
aea50f
   sync_properties (nm, FALSE);
aea50f
 
aea50f
-- 
aea50f
2.33.1
aea50f
aea50f
From 3bafff71d7588285763f603b23c830722a2169d1 Mon Sep 17 00:00:00 2001
aea50f
From: Julian Andres Klode <julian.klode@canonical.com>
aea50f
Date: Tue, 12 Oct 2021 17:31:42 +0200
aea50f
Subject: [PATCH 9/9] gnetworkmonitornm: Do not re-update cached property
aea50f
aea50f
GDBusProxy already takes care of updating the cached property
aea50f
before emitting the signal, so there is no need to do this
aea50f
a second time ourselves.
aea50f
---
aea50f
 gio/gnetworkmonitornm.c | 22 ----------------------
aea50f
 1 file changed, 22 deletions(-)
aea50f
aea50f
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
aea50f
index 6a6d1d666..a8040fb36 100644
aea50f
--- a/gio/gnetworkmonitornm.c
aea50f
+++ b/gio/gnetworkmonitornm.c
aea50f
@@ -252,34 +252,12 @@ sync_properties (GNetworkMonitorNM *nm,
aea50f
     }
aea50f
 }
aea50f
 
aea50f
-static void
aea50f
-update_cached_property (GDBusProxy   *proxy,
aea50f
-                        const char   *property_name,
aea50f
-                        GVariantDict *dict)
aea50f
-{
aea50f
-  GVariant *v;
aea50f
-
aea50f
-  v = g_variant_dict_lookup_value (dict, property_name, NULL);
aea50f
-  if (!v)
aea50f
-    return;
aea50f
-  g_dbus_proxy_set_cached_property (proxy, property_name, v);
aea50f
-  g_variant_unref (v);
aea50f
-}
aea50f
-
aea50f
 static void
aea50f
 proxy_properties_changed_cb (GDBusProxy        *proxy,
aea50f
                              GVariant          *changed_properties,
aea50f
                              GStrv              invalidated_properties,
aea50f
                              GNetworkMonitorNM *nm)
aea50f
 {
aea50f
-  GVariantDict *dict;
aea50f
-
aea50f
-  dict = g_variant_dict_new (changed_properties);
aea50f
-
aea50f
-  update_cached_property (nm->priv->proxy, "Connectivity", dict);
aea50f
-
aea50f
-  g_variant_dict_unref (dict);
aea50f
-
aea50f
   sync_properties (nm, TRUE);
aea50f
 }
aea50f
 
aea50f
-- 
aea50f
2.33.1