sip: attempt reconnection anytime network is routable, not just when routability changes
this resolves an issue where the network could be routable but DNS had failed, and CallsSipOrigin settled into the offline state with `CALLS_ACCOUNT_STATE_REASON_CONNECTION_DNS_ERROR`. in this situation, we now attempt a reconnection every 15s, instead of waiting for the network to go down and back up again.
This commit is contained in:
@@ -1105,6 +1105,12 @@ go_online (CallsAccount *account,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
go_online_opportunistically (CallsSipOrigin *self)
|
||||
{
|
||||
if (self->auto_connect)
|
||||
go_online (CALLS_ACCOUNT (self), TRUE);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_address (CallsAccount *account)
|
||||
@@ -1706,10 +1712,12 @@ calls_sip_origin_init (CallsSipOrigin *self)
|
||||
|
||||
if (!sip_test_env || sip_test_env[0] == '\0') {
|
||||
CallsNetworkWatch *nw = calls_network_watch_get_default ();
|
||||
if (nw)
|
||||
if (nw) {
|
||||
g_signal_connect_swapped (calls_network_watch_get_default (), "network-changed",
|
||||
G_CALLBACK (recreate_sip), self);
|
||||
else
|
||||
g_signal_connect_swapped (calls_network_watch_get_default (), "network-routable",
|
||||
G_CALLBACK (go_online_opportunistically), self);
|
||||
} else
|
||||
g_warning ("Network watch unavailable. Unable to detect network changes.");
|
||||
}
|
||||
|
||||
|
@@ -61,6 +61,7 @@ static GParamSpec *props[PROP_LAST_PROP];
|
||||
|
||||
enum {
|
||||
NETWORK_CHANGED,
|
||||
NETWORK_ROUTABLE,
|
||||
N_SIGNALS
|
||||
};
|
||||
static guint signals[N_SIGNALS];
|
||||
@@ -282,10 +283,12 @@ fetch_ipv6 (CallsNetworkWatch *self)
|
||||
static gboolean
|
||||
on_watch_network (CallsNetworkWatch *self)
|
||||
{
|
||||
gboolean has_v4 = fetch_ipv4 (self);
|
||||
gboolean has_v6 = fetch_ipv6 (self);
|
||||
gboolean changed_v4 = FALSE;
|
||||
gboolean changed_v6 = FALSE;
|
||||
|
||||
changed_v4 = fetch_ipv4 (self) && g_strcmp0 (self->tmp_addr, self->ipv4) != 0;
|
||||
changed_v4 = has_v4 && g_strcmp0 (self->tmp_addr, self->ipv4) != 0;
|
||||
if (changed_v4) {
|
||||
g_free (self->ipv4);
|
||||
self->ipv4 = g_strdup (self->tmp_addr);
|
||||
@@ -293,7 +296,7 @@ on_watch_network (CallsNetworkWatch *self)
|
||||
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_IPV4]);
|
||||
}
|
||||
|
||||
changed_v6 = fetch_ipv6 (self) && g_strcmp0 (self->tmp_addr, self->ipv6) != 0;
|
||||
changed_v6 = has_v6 && g_strcmp0 (self->tmp_addr, self->ipv6) != 0;
|
||||
if (changed_v6) {
|
||||
g_free (self->ipv6);
|
||||
self->ipv6 = g_strdup (self->tmp_addr);
|
||||
@@ -304,6 +307,9 @@ on_watch_network (CallsNetworkWatch *self)
|
||||
if (changed_v4 || changed_v6)
|
||||
g_signal_emit (self, signals[NETWORK_CHANGED], 0);
|
||||
|
||||
if (has_v4 || has_v6)
|
||||
g_signal_emit (self, signals[NETWORK_ROUTABLE], 0);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -360,6 +366,13 @@ calls_network_watch_class_init (CallsNetworkWatchClass *klass)
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
signals[NETWORK_ROUTABLE] = g_signal_new ("network-routable",
|
||||
CALLS_TYPE_NETWORK_WATCH,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
|
||||
props[PROP_IPV4] =
|
||||
g_param_spec_string ("ipv4",
|
||||
|
Reference in New Issue
Block a user