summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 6c49236ce..2d3786256 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7403,6 +7403,11 @@ static int sip_answer(struct ast_channel *ast)
ast_rtp_instance_update_source(p->rtp);
res = transmit_response_with_sdp(p, "200 OK", &p->initreq, XMIT_CRITICAL, oldsdp, TRUE);
ast_set_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED);
+ /* RFC says the session timer starts counting on 200,
+ * not on INVITE. */
+ if (p->stimer->st_active == TRUE) {
+ start_session_timer(p);
+ }
}
sip_pvt_unlock(p);
return res;
@@ -25721,12 +25726,8 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, str
/* Check if OLI/ANI-II is present in From: */
parse_oli(req, p->owner);
- if (p->stimer->st_active == TRUE) {
- if (reinvite == 0) {
- start_session_timer(p);
- } else {
- restart_session_timer(p);
- }
+ if (reinvite && p->stimer->st_active == TRUE) {
+ restart_session_timer(p);
}
if (!req->ignore && p)
@@ -26574,7 +26575,9 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req)
}
stop_media_flows(p); /* Immediately stop RTP, VRTP and UDPTL as applicable */
- stop_session_timer(p); /* Stop Session-Timer */
+ if (p->stimer) {
+ stop_session_timer(p); /* Stop Session-Timer */
+ }
if (!ast_strlen_zero(sip_get_header(req, "Also"))) {
ast_log(LOG_NOTICE, "Client '%s' using deprecated BYE/Also transfer method. Ask vendor to support REFER instead\n",
@@ -28935,11 +28938,6 @@ static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub,
/*! \brief Session-Timers: Restart session timer */
static void restart_session_timer(struct sip_pvt *p)
{
- if (!p->stimer) {
- ast_log(LOG_WARNING, "Null stimer in restart_session_timer - %s\n", p->callid);
- return;
- }
-
if (p->stimer->st_active == TRUE) {
ast_debug(2, "Session timer stopped: %d - %s\n", p->stimer->st_schedid, p->callid);
AST_SCHED_DEL_UNREF(sched, p->stimer->st_schedid,
@@ -28952,11 +28950,6 @@ static void restart_session_timer(struct sip_pvt *p)
/*! \brief Session-Timers: Stop session timer */
static void stop_session_timer(struct sip_pvt *p)
{
- if (!p->stimer) {
- ast_log(LOG_WARNING, "Null stimer in stop_session_timer - %s\n", p->callid);
- return;
- }
-
if (p->stimer->st_active == TRUE) {
p->stimer->st_active = FALSE;
ast_debug(2, "Session timer stopped: %d - %s\n", p->stimer->st_schedid, p->callid);
@@ -28971,11 +28964,6 @@ static void start_session_timer(struct sip_pvt *p)
{
unsigned int timeout_ms;
- if (!p->stimer) {
- ast_log(LOG_WARNING, "Null stimer in start_session_timer - %s\n", p->callid);
- return;
- }
-
if (p->stimer->st_schedid > -1) {
/* in the event a timer is already going, stop it */
ast_debug(2, "Session timer stopped: %d - %s\n", p->stimer->st_schedid, p->callid);
@@ -29066,7 +29054,11 @@ return_unref:
/* An error occurred. Stop session timer processing */
if (p->stimer) {
ast_debug(2, "Session timer stopped: %d - %s\n", p->stimer->st_schedid, p->callid);
+ /* Don't pass go, don't collect $200.. we are the scheduled
+ * callback. We can rip ourself out here. */
p->stimer->st_schedid = -1;
+ /* Calling stop_session_timer is nice for consistent debug
+ * logs. */
stop_session_timer(p);
}