]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Properly handle 408 request timeout - according to the RFC, the dialog dies if a...
authorOlle Johansson <oej@edvina.net>
Tue, 29 May 2007 19:32:57 +0000 (19:32 +0000)
committerOlle Johansson <oej@edvina.net>
Tue, 29 May 2007 19:32:57 +0000 (19:32 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@66503 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index d494be206ce17c8ad4a252b17c9d43fdfcf2e854..644dc4b6a1d1b4ffef55441442b322bc4f48d232 100644 (file)
@@ -11926,6 +11926,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                sip_alreadygone(p);
                break;
 
+       case 408: /* Request timeout */
        case 481: /* Call leg does not exist */
                /* Could be REFER caused INVITE with replaces */
                ast_log(LOG_WARNING, "Re-invite to non-existing call leg on other UA. SIP dialog '%s'. Giving up.\n", p->callid);
@@ -12100,6 +12101,14 @@ static int handle_response_register(struct sip_pvt *p, int resp, char *rest, str
                        ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
                }
                break;
+       case 408:       /* Request timeout */
+               if (global_regattempts_max)
+                       p->registry->regattempts = global_regattempts_max+1;
+               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
+               r->call = NULL;
+               ast_sched_del(sched, r->timeout);
+               r->timeout = -1;
+               break;
        case 479:       /* SER: Not able to process the URI - address is wrong in register*/
                ast_log(LOG_WARNING, "Got error 479 on register to %s@%s, giving up (check config)\n", p->registry->username,p->registry->hostname);
                if (global_regattempts_max)
@@ -12389,6 +12398,21 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                        } else  /* We can't handle this, giving up in a bad way */
                                ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
 
+                       break;
+               case 408: /* Request timeout - terminate dialog */
+                       if (sipmethod == SIP_INVITE)
+                               handle_response_invite(p, resp, rest, req, seqno);
+                       else if (sipmethod == SIP_REGISTER) 
+                               res = handle_response_register(p, resp, rest, req, ignore, seqno);
+                       else if (sipmethod == SIP_BYE) {
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY); 
+                               if (option_debug)
+                                       ast_log(LOG_DEBUG, "Got timeout on bye. Thanks for the answer. Now, kill this call\n");
+                       } else {
+                               if (owner)
+                                       ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
+                               ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);    
+                       }
                        break;
                case 481: /* Call leg does not exist */
                        if (sipmethod == SIP_INVITE) {