From: Kevin P. Fleming Date: Mon, 31 Jul 2006 21:14:11 +0000 (+0000) Subject: don't reissue hangup requests for SIP channels that have expired their RTP timeouts... X-Git-Tag: 1.2.11~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=532ff6487b2498362ddb8acaba18ccec21f62375;p=thirdparty%2Fasterisk.git don't reissue hangup requests for SIP channels that have expired their RTP timeouts (one time is enough) don't rescan the SIP private structure list too fast, it can cause channels to not be able to hang up (issue #7495, and probably others) use ast_softhangup_nolock() since we already hold the channel's lock git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@38611 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index cb35b86724..3416cddad8 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -11439,7 +11439,11 @@ static void *do_monitor(void *data) restartsearch: time(&t); sip = iflist; - while(sip) { + /* don't scan the interface list if it hasn't been a reasonable period + of time since the last time we did it (when MWI is being sent, we can + get back to this point every millisecond or less) + */ + while(!fastrestart && sip) { ast_mutex_lock(&sip->lock); if (sip->rtp && sip->owner && (sip->owner->_state == AST_STATE_UP) && !sip->redirip.sin_addr.s_addr) { if (sip->lastrtptx && sip->rtpkeepalive && t > sip->lastrtptx + sip->rtpkeepalive) { @@ -11464,8 +11468,14 @@ restartsearch: if (sip->owner) { ast_log(LOG_NOTICE, "Disconnecting call '%s' for lack of RTP activity in %ld seconds\n", sip->owner->name, (long)(t - sip->lastrtprx)); /* Issue a softhangup */ - ast_softhangup(sip->owner, AST_SOFTHANGUP_DEV); + ast_softhangup_nolock(sip->owner, AST_SOFTHANGUP_DEV); ast_mutex_unlock(&sip->owner->lock); + /* forget the timeouts for this call, since a hangup + has already been requested and we don't want to + repeatedly request hangups + */ + sip->rtptimeout = 0; + sip->rtpholdtimeout = 0; } } }