diff options
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 7 | ||||
-rw-r--r-- | channels/sip/include/sip.h | 1 |
2 files changed, 6 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 5efbfbf34..f7a0946ee 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -6492,7 +6492,7 @@ static int sip_hangup(struct ast_channel *ast) stop_session_timer(p); } - if (!p->pendinginvite) { + if (!p->pendinginvite || p->ongoing_reinvite) { struct ast_channel *bridge = ast_bridged_channel(oldowner); char quality_buf[AST_MAX_USER_FIELD], *quality; @@ -12539,7 +12539,7 @@ static int transmit_reinvite_with_sdp(struct sip_pvt *p, int t38version, int old initialize_initreq(p, &req); p->lastinvite = p->ocseq; ast_set_flag(&p->flags[0], SIP_OUTGOING); /* Change direction of this dialog */ - + p->ongoing_reinvite = 1; return send_request(p, &req, XMIT_CRITICAL, p->ocseq); } @@ -21136,6 +21136,9 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest /* Final response, clear out pending invite */ if ((resp == 200 || resp >= 300) && p->pendinginvite && seqno == p->pendinginvite) { p->pendinginvite = 0; + if (reinvite) { + p->ongoing_reinvite = 0; + } } /* If this is a response to our initial INVITE, we need to set what we can use diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h index dbf572388..d7555ba8d 100644 --- a/channels/sip/include/sip.h +++ b/channels/sip/include/sip.h @@ -1127,6 +1127,7 @@ struct sip_pvt { struct sip_auth_container *peerauth;/*!< Realm authentication credentials */ int noncecount; /*!< Nonce-count */ unsigned int stalenonce:1; /*!< Marks the current nonce as responded too */ + unsigned int ongoing_reinvite:1; /*!< There is a reinvite in progress that might need to be cleaned up */ char lastmsg[256]; /*!< Last Message sent/received */ int amaflags; /*!< AMA Flags */ uint32_t pendinginvite; /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */ |