gnetworkmonitornm: Fix network available detection

The network-available property can be asserted by querying the NMState
describing the current overval network state, instead of the
NMConnectivityState. The advantage of the NMState is that is reflects
immediately the network state modification, while the connectivity
state is tested at a fixed frequency.
This commit is contained in:
Fabrice Bellet
2019-04-29 12:05:54 +00:00
committed by Philip Withnall
parent 798c59a14f
commit 719133e882

View File

@@ -52,6 +52,19 @@ typedef enum {
NM_CONNECTIVITY_FULL NM_CONNECTIVITY_FULL
} NMConnectivityState; } NMConnectivityState;
/* Copied from https://developer.gnome.org/libnm-util/stable/libnm-util-NetworkManager.html#NMState;
* used inline to avoid a NetworkManager dependency from GLib. */
typedef enum {
NM_STATE_UNKNOWN = 0,
NM_STATE_ASLEEP = 10,
NM_STATE_DISCONNECTED = 20,
NM_STATE_DISCONNECTING = 30,
NM_STATE_CONNECTING = 40,
NM_STATE_CONNECTED_LOCAL = 50,
NM_STATE_CONNECTED_SITE = 60,
NM_STATE_CONNECTED_GLOBAL = 70,
} NMState;
struct _GNetworkMonitorNMPrivate struct _GNetworkMonitorNMPrivate
{ {
GDBusProxy *proxy; GDBusProxy *proxy;
@@ -155,11 +168,19 @@ sync_properties (GNetworkMonitorNM *nm,
gboolean emit_signals) gboolean emit_signals)
{ {
GVariant *v; GVariant *v;
NMState nm_state;
NMConnectivityState nm_connectivity; NMConnectivityState nm_connectivity;
gboolean new_network_available; gboolean new_network_available;
gboolean new_network_metered; gboolean new_network_metered;
GNetworkConnectivity new_connectivity; GNetworkConnectivity new_connectivity;
v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "State");
if (!v)
return;
nm_state = g_variant_get_uint32 (v);
g_variant_unref (v);
v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "Connectivity"); v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "Connectivity");
if (!v) if (!v)
return; return;
@@ -167,14 +188,26 @@ sync_properties (GNetworkMonitorNM *nm,
nm_connectivity = g_variant_get_uint32 (v); nm_connectivity = g_variant_get_uint32 (v);
g_variant_unref (v); g_variant_unref (v);
if (nm_connectivity == NM_CONNECTIVITY_UNKNOWN || if (nm_state <= NM_STATE_CONNECTED_LOCAL)
nm_connectivity == NM_CONNECTIVITY_NONE)
{ {
new_network_available = FALSE; new_network_available = FALSE;
new_network_metered = FALSE; new_network_metered = FALSE;
new_connectivity = G_NETWORK_CONNECTIVITY_LOCAL; new_connectivity = G_NETWORK_CONNECTIVITY_LOCAL;
} }
else else if (nm_state <= NM_STATE_CONNECTED_SITE)
{
new_network_available = FALSE;
new_network_metered = FALSE;
if (nm_connectivity == NM_CONNECTIVITY_PORTAL)
{
new_connectivity = G_NETWORK_CONNECTIVITY_PORTAL;
}
else
{
new_connectivity = G_NETWORK_CONNECTIVITY_LIMITED;
}
}
else /* nm_state == NM_STATE_CONNECTED_FULL */
{ {
/* this is only available post NM 1.0 */ /* this is only available post NM 1.0 */