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:
2024-08-18 13:45:06 +00:00
parent 017b26a0c8
commit db9192a69c
2 changed files with 25 additions and 4 deletions

View File

@@ -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.");
}

View File

@@ -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",