diff options
author | oej <oej@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-06 16:25:06 +0000 |
---|---|---|
committer | oej <oej@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-06 16:25:06 +0000 |
commit | f39051c1147a6b9b831dd0ebaa131d8ae175c0f1 (patch) | |
tree | 7146a8052cd09d0602f6103dfb2fb3c9cb2c29b7 | |
parent | c8c5d18ce410f255b4c8c036f855adce788deeb0 (diff) |
Issue #8258 - fix handling of 487 being retransmitted to Asterisk
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@48326 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channels/chan_sip.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index ea92c3364..36eac0ad0 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -11748,7 +11748,16 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru ast_queue_control(p->owner, AST_CONTROL_CONGESTION); sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); break; - + case 487: /* Cancelled transaction */ + /* We have sent CANCEL on an outbound INVITE + This transaction is already scheduled to be killed by sip_hangup(). + */ + transmit_request(p, SIP_ACK, seqno, 0, 0); + if (p->owner && !ast_test_flag(req, SIP_PKT_IGNORE)) + ast_queue_hangup(p->owner); + else if (!ast_test_flag(req, SIP_PKT_IGNORE)) + update_call_counter(p, DEC_CALL_LIMIT); + break; case 491: /* Pending */ /* we really should have to wait a while, then retransmit */ /* We should support the retry-after at some point */ @@ -11760,6 +11769,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru break; case 501: /* Not implemented */ + transmit_request(p, SIP_ACK, seqno, 0, 0); if (p->owner) ast_queue_control(p->owner, AST_CONTROL_CONGESTION); break; @@ -12166,6 +12176,10 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_ /* Guessing that this is not an important request */ } break; + case 487: + if (sipmethod == SIP_INVITE) + handle_response_invite(p, resp, rest, req, seqno); + break; case 491: /* Pending */ if (sipmethod == SIP_INVITE) handle_response_invite(p, resp, rest, req, seqno); @@ -12211,12 +12225,6 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_ if (p->owner) ast_queue_control(p->owner, AST_CONTROL_BUSY); break; - case 487: /* Response on INVITE that has been CANCELled */ - /* channel now destroyed - dec the inUse counter */ - if (owner) - ast_queue_hangup(p->owner); - update_call_counter(p, DEC_CALL_LIMIT); - break; case 482: /* \note SIP is incapable of performing a hairpin call, which is yet another failure of not having a layer 2 (again, YAY |