diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-07-31 21:14:11 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-07-31 21:14:11 +0000 |
commit | e9cd74efc4981c417a355d78351a14cc4487f924 (patch) | |
tree | c65a2e81f755347d30eb69d6f8c99de71c040078 /channels | |
parent | 587458a74898c7eccc4e564b5839548e57dbc474 (diff) |
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: http://svn.digium.com/svn/asterisk/branches/1.2@38611 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index cb35b8672..3416cddad 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; } } } |