int initial,
msg_t *msg, sip_t *sip);
-static void session_timer_negotiate(struct session_timer *t);
+static void session_timer_negotiate(struct session_timer *t, int uas);
-static void session_timer_set(nua_session_usage_t *ss);
+static void session_timer_set(nua_session_usage_t *ss, int uas);
static int session_timer_check_restart(nua_client_request_t *cr,
int status, char const *phrase,
{
nua_dialog_usage_t *du = cr->cr_usage;
nua_session_usage_t *ss = nua_dialog_usage_private(du);
+ int uas;
if (ss == NULL || sip == NULL) {
/* Xyzzy */
if (session_timer_is_supported(ss->ss_timer))
session_timer_store(ss->ss_timer, sip);
- session_timer_set(ss);
+ session_timer_set(ss, uas = 0);
}
return nua_session_client_response(cr, status, phrase, sip);
nua_session_usage_t *ss = nua_dialog_usage_private(sr->sr_usage);
msg_t *msg = nta_incoming_getrequest_ackcancel(irq);
char const *recv = NULL;
+ int uas;
if (ss == NULL)
return 0;
nua_stack_event(nh->nh_nua, nh, msg, nua_i_ack, SIP_200_OK, NULL);
signal_call_state_change(nh, ss, 200, "OK", nua_callstate_ready);
- session_timer_set(ss);
+ session_timer_set(ss, uas = 1);
nua_server_request_destroy(sr);
nua_handle_t *nh = cr->cr_owner;
nua_dialog_usage_t *du = cr->cr_usage;
nua_session_usage_t *ss = nua_dialog_usage_private(du);
+ int uas;
assert(200 <= status);
if (!sr && (!du->du_cr || !du->du_cr->cr_orq)) {
session_timer_store(ss->ss_timer, sip);
- session_timer_set(ss);
+ session_timer_set(ss, uas = 0);
}
}
}
if (ss && session_timer_is_supported(ss->ss_timer)) {
nua_server_request_t *sr0;
+ int uas;
session_timer_add_headers(ss->ss_timer, 0, msg, sip);
break;
if (!sr0 && (!sr->sr_usage->du_cr || !sr->sr_usage->du_cr->cr_orq))
- session_timer_set(ss);
+ session_timer_set(ss, uas = 1);
}
}
static int
session_timer_add_headers(struct session_timer *t,
int initial,
- msg_t *msg, sip_t *sip)
+ msg_t *msg,
+ sip_t *sip)
{
unsigned long expires, min;
sip_min_se_t min_se[1];
min = t->remote.min_se;
if (uas) {
- session_timer_negotiate(t);
+ session_timer_negotiate(t, uas = 1);
refresher = t->refresher;
expires = t->interval;
return 1;
}
-static
-void session_timer_negotiate(struct session_timer *t)
+static void
+session_timer_negotiate(struct session_timer *t, int uas)
{
if (!t->local.supported)
t->refresher = nua_no_refresher;
t->refresher = nua_local_refresher;
else if (t->remote.refresher == nua_remote_refresher)
t->refresher = nua_remote_refresher;
+ else if (uas)
+ /* UAS defaults UAC to refreshing */
+ t->refresher = nua_remote_refresher;
else
- /* Default to initiate refreshes */
+ /* UAC refreshes by itself */
t->refresher = nua_local_refresher;
t->interval = t->remote.expires;
}
static void
-session_timer_set(nua_session_usage_t *ss)
+session_timer_set(nua_session_usage_t *ss, int uas)
{
nua_dialog_usage_t *du = nua_dialog_usage_public(ss);
struct session_timer *t;
t = ss->ss_timer;
- session_timer_negotiate(t);
+ session_timer_negotiate(t, uas);
if (t->refresher == nua_local_refresher) {
unsigned low = t->interval / 2, high = t->interval / 2;