]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Relay proper SIP responses on calling side.
authorMark Michelson <mmichelson@digium.com>
Mon, 4 Jun 2012 22:02:26 +0000 (22:02 +0000)
committerMark Michelson <mmichelson@digium.com>
Mon, 4 Jun 2012 22:02:26 +0000 (22:02 +0000)
Revision 351130 broke corect HANGUPCAUSE setting
for the 404 case in chan_sip. Other cases were also
potentially broken. This patch fixes the relaying
of causes to be what they used to be.

(closes issue ASTERISK-19914)
Reported by Pavel Troller
Tested by Walter Doekes (via a reviewboard test to be committed later)
Patches:
chan_sip.diff uploaded by Pavel Troller (license #6302)
........

Merged revisions 368498 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@368499 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 117876f448885a2df591ee019a90a451c742c240..b83f4495dd1a1be3d164a1ed6457a52bad1f8f7c 100644 (file)
@@ -20988,7 +20988,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                ast_log(LOG_WARNING, "Received response: \"Forbidden\" from '%s'\n", sip_get_header(&p->initreq, "From"));
                if (!req->ignore && p->owner) {
                        ast_set_hangupsource(p->owner, p->owner->name, 0);
-                       ast_queue_hangup_with_cause(p->owner, AST_CAUSE_CONGESTION);
+                       ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
                }
                break;
 
@@ -20996,7 +20996,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
                if (p->owner && !req->ignore) {
                        ast_set_hangupsource(p->owner, p->owner->name, 0);
-                       ast_queue_hangup_with_cause(p->owner, AST_CAUSE_CONGESTION);
+                       ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
                }
                break;
 
@@ -21006,7 +21006,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                ast_log(LOG_WARNING, "Re-invite to non-existing call leg on other UA. SIP dialog '%s'. Giving up.\n", p->callid);
                xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
                if (p->owner) {
-                       ast_queue_hangup_with_cause(p->owner, AST_CAUSE_CONGESTION);
+                       ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
                }
                break;
 
@@ -21021,7 +21021,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                append_history(p, "Identity", "SIP identity is required. Not supported by Asterisk.");
                ast_log(LOG_WARNING, "SIP identity required by proxy. SIP dialog '%s'. Giving up.\n", p->callid);
                if (p->owner && !req->ignore) {
-                       ast_queue_hangup_with_cause(p->owner, AST_CAUSE_CONGESTION);
+                       ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
                }
                break;
 
@@ -21054,7 +21054,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                } else {
                        /* We can't set up this call, so give up */
                        if (p->owner && !req->ignore) {
-                               ast_queue_hangup_with_cause(p->owner, AST_CAUSE_CONGESTION);
+                               ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
                        }
                }
                break;
@@ -21062,7 +21062,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
                if (p->owner && !req->ignore) {
                        if (p->owner->_state != AST_STATE_UP) {
-                               ast_queue_hangup_with_cause(p->owner, AST_CAUSE_CONGESTION);
+                               ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
                        } else {
                                /* This is a re-invite that failed. */
                                /* Reset the flag after a while
@@ -21086,7 +21086,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
        case 501: /* Not implemented */
                xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
                if (p->owner) {
-                       ast_queue_hangup_with_cause(p->owner, AST_CAUSE_CONGESTION);
+                       ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
                }
                break;
        }
@@ -22002,7 +22002,7 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc
                                default:
                                        /* Send hangup */       
                                        if (owner && sipmethod != SIP_BYE)
-                                               ast_queue_hangup_with_cause(p->owner, AST_CAUSE_PROTOCOL_ERROR);
+                                               ast_queue_hangup_with_cause(p->owner, hangup_sip2cause(resp));
                                        break;
                                }
                                /* ACK on invite */