aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-10 17:42:19 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-10 17:42:19 +0000
commitce7b3c77902d1da7fa4c53927f6ae1ab49d1122d (patch)
tree34a599b6ec4f55bb0cf662cd8856c8267f4f13e3 /channels
parent0c7b93faeadb2a54a5b3ee60c6784bf79fb4461e (diff)
Merged revisions 205878 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r205878 | mmichelson | 2009-07-10 12:39:57 -0500 (Fri, 10 Jul 2009) | 30 lines Merged revisions 205877 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r205877 | mmichelson | 2009-07-10 12:39:13 -0500 (Fri, 10 Jul 2009) | 23 lines Merged revisions 205776 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r205776 | mmichelson | 2009-07-10 10:56:45 -0500 (Fri, 10 Jul 2009) | 16 lines Merged revisions 205775 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r205775 | mmichelson | 2009-07-10 10:51:36 -0500 (Fri, 10 Jul 2009) | 10 lines Ensure that outbound NOTIFY requests are properly routed through stateful proxies. With this change, we make note of Record-Route headers present in any SUBSCRIBE request that we receive so that our outbound NOTIFY requests will have the proper Route headers in them. (closes issue #14725) Reported by: ibc ........ ................ ................ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@205879 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index be6a116fe..52d5e7455 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -3079,9 +3079,20 @@ static int __sip_autodestruct(const void *data)
/* If there are packets still waiting for delivery, delay the destruction */
if (p->packets) {
- ast_debug(3, "Re-scheduled destruction of SIP call %s\n", p->callid ? p->callid : "<unknown>");
- append_history(p, "ReliableXmit", "timeout");
- return 10000;
+ if (!p->needdestroy) {
+ char method_str[30];
+ ast_debug(3, "Re-scheduled destruction of SIP call %s\n", p->callid ? p->callid : "<unknown>");
+ append_history(p, "ReliableXmit", "timeout");
+ if (sscanf(p->lastmsg, "Tx: %s", method_str) == 1 || sscanf(p->lastmsg, "Rx: %s", method_str) == 1) {
+ if (method_match(SIP_CANCEL, method_str) || method_match(SIP_BYE, method_str)) {
+ pvt_set_needdestroy(p, "autodestruct");
+ }
+ }
+ return 10000;
+ } else {
+ /* They've had their chance to respond. Time to bail */
+ __sip_pretend_ack(p);
+ }
}
if (p->subscribed == MWI_NOTIFICATION)
@@ -5115,7 +5126,10 @@ static int sip_hangup(struct ast_channel *ast)
if (needcancel) { /* Outgoing call, not up */
if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
/* stop retransmitting an INVITE that has not received a response */
- __sip_pretend_ack(p);
+ struct sip_pkt *cur;
+ for (cur = p->packets; cur; cur = cur->next) {
+ __sip_semi_ack(p, cur->seqno, cur->is_resp, cur->method ? cur->method : find_sip_method(cur->data->str));
+ }
/* if we can't send right now, mark it pending */
if (p->invitestate == INV_CALLING) {