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
1.2
Kevin P. Fleming 19 years ago
parent f41b9baed4
commit 532ff6487b

@ -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;
}
}
}

Loading…
Cancel
Save