Fix issue where if both sides of the dialog cancelled the dialog at the same time chan_sip could kepe retransmitting a response for no reason.

(closes issue #9566)
Reported by: atca_pres
Patches:
      bug9566.patch uploaded by oej


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@87342 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Joshua Colp
2007-10-29 17:20:28 +00:00
parent 71319ccaa9
commit 143536912e

View File

@@ -3511,6 +3511,7 @@ static int sip_hangup(struct ast_channel *ast)
INVITE, but do set an autodestruct just in case we never get it. */
needdestroy = 0;
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
p->invitestate = INV_CANCELLED;
}
if ( p->initid != -1 ) {
/* channel still up - reverse dec of inUse counter
@@ -3523,6 +3524,7 @@ static int sip_hangup(struct ast_channel *ast)
transmit_response_reliable(p, res, &p->initreq);
else
transmit_response_reliable(p, "603 Declined", &p->initreq);
p->invitestate = INV_TERMINATED;
}
} else { /* Call is in UP state, send BYE */
if (!p->pendinginvite) {
@@ -14361,6 +14363,15 @@ static int handle_request_cancel(struct sip_pvt *p, struct sip_request *req)
check_via(p, req);
sip_alreadygone(p);
/* At this point, we could have cancelled the invite at the same time
as the other side sends a CANCEL. Our final reply with error code
might not have been received by the other side before the CANCEL
was sent, so let's just give up retransmissions and waiting for
ACK on our error code. The call is hanging up any way. */
if (p->invitestate == INV_TERMINATED)
__sip_pretend_ack(p);
else
p->invitestate = INV_CANCELLED;
if (p->owner && p->owner->_state == AST_STATE_UP) {