aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-07-31 21:14:11 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-07-31 21:14:11 +0000
commite9cd74efc4981c417a355d78351a14cc4487f924 (patch)
treec65a2e81f755347d30eb69d6f8c99de71c040078 /channels
parent587458a74898c7eccc4e564b5839548e57dbc474 (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.c14
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;
}
}
}