mirror of https://github.com/sipwise/asterisk.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.7 KiB
37 lines
1.7 KiB
--- channels/chan_sip.c (revisión: 194483)
|
|
+++ channels/chan_sip.c (revisión: 194484)
|
|
@@ -14395,7 +14395,7 @@
|
|
}
|
|
|
|
/* Check if this is a loop */
|
|
- if (ast_test_flag(&p->flags[0], SIP_OUTGOING) && p->owner && (p->owner->_state != AST_STATE_UP)) {
|
|
+ if (ast_test_flag(&p->flags[0], SIP_OUTGOING) && p->owner && (p->invitestate != INV_TERMINATED && p->invitestate != INV_CONFIRMED)) {
|
|
/* This is a call to ourself. Send ourselves an error code and stop
|
|
processing immediately, as SIP really has no good mechanism for
|
|
being able to call yourself */
|
|
@@ -14824,9 +14824,21 @@
|
|
p->invitestate = INV_PROCEEDING;
|
|
break;
|
|
case AST_STATE_RINGING:
|
|
- transmit_response(p, "180 Ringing", req);
|
|
- p->invitestate = INV_PROCEEDING;
|
|
- break;
|
|
+ if (reinvite && (p->invitestate == INV_TERMINATED || p->invitestate == INV_CONFIRMED)) {
|
|
+ /* If these conditions are true, and the channel is still in the 'ringing'
|
|
+ * state, then this likely means that we have a situation where the initial
|
|
+ * INVITE transaction has completed *but* the channel's state has not yet been
|
|
+ * changed to UP. The reason this could happen is if the reinvite is received
|
|
+ * on the SIP socket prior to an application calling ast_read on this channel
|
|
+ * to read the answer frame we earlier queued on it. In this case, the reinvite
|
|
+ * is completely legitimate so we need to handle this the same as if the channel
|
|
+ * were already UP. Thus we are purposely falling through to the AST_STATE_UP case.
|
|
+ */
|
|
+ } else {
|
|
+ transmit_response(p, "180 Ringing", req);
|
|
+ p->invitestate = INV_PROCEEDING;
|
|
+ break;
|
|
+ }
|
|
case AST_STATE_UP:
|
|
if (option_debug > 1)
|
|
ast_log(LOG_DEBUG, "%s: This call is UP.... \n", c->name);
|