]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Send all responses to an INVITE reliably, so that we retransmit if we don't get an...
authorOlle Johansson <oej@edvina.net>
Mon, 30 Jun 2008 12:50:55 +0000 (12:50 +0000)
committerOlle Johansson <oej@edvina.net>
Mon, 30 Jun 2008 12:50:55 +0000 (12:50 +0000)
also fail if we don't get the very same precious ACK. Based on patch by tsearle, with
my own additions.

(closes issue #12951)

Reported by: tsearle
Patches:
      busy_retransmit.patch uploaded by tsearle (license 373)

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

channels/chan_sip.c

index 8a4ad80149ed510a181f36e949c1a105fb3359dc..e9adaaa1803b970d3c12825a3cc08d562ff89150 100644 (file)
@@ -3924,7 +3924,7 @@ static int sip_indicate(struct ast_channel *ast, int condition, const void *data
                break;
        case AST_CONTROL_BUSY:
                if (ast->_state != AST_STATE_UP) {
-                       transmit_response(p, "486 Busy Here", &p->initreq);
+                       transmit_response_reliable(p, "486 Busy Here", &p->initreq);
                        p->invitestate = INV_COMPLETED;
                        sip_alreadygone(p);
                        ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
@@ -3934,7 +3934,7 @@ static int sip_indicate(struct ast_channel *ast, int condition, const void *data
                break;
        case AST_CONTROL_CONGESTION:
                if (ast->_state != AST_STATE_UP) {
-                       transmit_response(p, "503 Service Unavailable", &p->initreq);
+                       transmit_response_reliable(p, "503 Service Unavailable", &p->initreq);
                        p->invitestate = INV_COMPLETED;
                        sip_alreadygone(p);
                        ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
@@ -13815,7 +13815,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                being able to call yourself */
                /* If pedantic is on, we need to check the tags. If they're different, this is
                in fact a forked call through a SIP proxy somewhere. */
-               transmit_response(p, "482 Loop Detected", req);
+               transmit_response_reliable(p, "482 Loop Detected", req);
                p->invitestate = INV_COMPLETED;
                sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                return 0;
@@ -13823,7 +13823,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
        
        if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->pendinginvite) {
                /* We already have a pending invite. Sorry. You are on hold. */
-               transmit_response(p, "491 Request Pending", req);
+               transmit_response_reliable(p, "491 Request Pending", req);
                if (option_debug)
                        ast_log(LOG_DEBUG, "Got INVITE on call where we already have pending INVITE, deferring that - %s\n", p->callid);
                /* Don't destroy dialog here */
@@ -13842,7 +13842,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                if (p->owner) {
                        if (option_debug > 2)
                                ast_log(LOG_DEBUG, "INVITE w Replaces on existing call? Refusing action. [%s]\n", p->callid);
-                       transmit_response(p, "400 Bad request", req);   /* The best way to not not accept the transfer */
+                       transmit_response_reliable(p, "400 Bad request", req);  /* The best way to not not accept the transfer */
                        /* Do not destroy existing call */
                        return -1;
                }
@@ -13854,7 +13854,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                ast_uri_decode(replace_id);
 
                if (!p->refer && !sip_refer_allocate(p)) {
-                       transmit_response(p, "500 Server Internal Error", req);
+                       transmit_response_reliable(p, "500 Server Internal Error", req);
                        append_history(p, "Xfer", "INVITE/Replace Failed. Out of memory.");
                        sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                        p->invitestate = INV_COMPLETED;
@@ -13892,7 +13892,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                */
                if ((p->refer->refer_call = get_sip_pvt_byid_locked(replace_id, totag, fromtag)) == NULL) {
                        ast_log(LOG_NOTICE, "Supervised transfer attempted to replace non-existent call id (%s)!\n", replace_id);
-                       transmit_response(p, "481 Call Leg Does Not Exist (Replaces)", req);
+                       transmit_response_reliable(p, "481 Call Leg Does Not Exist (Replaces)", req);
                        error = 1;
                }
 
@@ -13905,7 +13905,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                if (p->refer->refer_call == p) {
                        ast_log(LOG_NOTICE, "INVITE with replaces into it's own call id (%s == %s)!\n", replace_id, p->callid);
                        p->refer->refer_call = NULL;
-                       transmit_response(p, "400 Bad request", req);   /* The best way to not not accept the transfer */
+                       transmit_response_reliable(p, "400 Bad request", req);  /* The best way to not not accept the transfer */
                        error = 1;
                }
 
@@ -13913,13 +13913,13 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        /* Oops, someting wrong anyway, no owner, no call */
                        ast_log(LOG_NOTICE, "Supervised transfer attempted to replace non-existing call id (%s)!\n", replace_id);
                        /* Check for better return code */
-                       transmit_response(p, "481 Call Leg Does Not Exist (Replace)", req);
+                       transmit_response_reliable(p, "481 Call Leg Does Not Exist (Replace)", req);
                        error = 1;
                }
 
                if (!error && p->refer->refer_call->owner->_state != AST_STATE_RINGING && p->refer->refer_call->owner->_state != AST_STATE_RING && p->refer->refer_call->owner->_state != AST_STATE_UP ) {
                        ast_log(LOG_NOTICE, "Supervised transfer attempted to replace non-ringing or active call id (%s)!\n", replace_id);
-                       transmit_response(p, "603 Declined (Replaces)", req);
+                       transmit_response_reliable(p, "603 Declined (Replaces)", req);
                        error = 1;
                }
 
@@ -13961,7 +13961,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        /* Handle SDP here if we already have an owner */
                        if (find_sdp(req)) {
                                if (process_sdp(p, req)) {
-                                       transmit_response(p, "488 Not acceptable here", req);
+                                       transmit_response_reliable(p, "488 Not acceptable here", req);
                                        if (!p->lastinvite)
                                                sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
                                        return -1;