From df8c773783c8a89ad6e1f97553b32962b4ae418f Mon Sep 17 00:00:00 2001 From: Olle Johansson Date: Sat, 2 Dec 2006 20:30:58 +0000 Subject: Send CANCEL to call with early media (PROGRESS INBAND). This is imported from branch "invitestate" and "invitestate-1.4" *** *** *** IF YOU HAVE ISSUES WITH BYEs/CANCELs - PLEASE UPDATE AND TEST AGAIN! *** Thank you! *** *** /Olle git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@48216 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'channels') diff --git a/channels/chan_sip.c b/channels/chan_sip.c index aa59b7038..3974620bd 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -242,15 +242,15 @@ enum sip_result { \note this is for the INVITE that sets up the dialog */ enum invitestates { - INV_NONE = 0, /*!< No state at all, maybe not an INVITE dialog */ - INV_CALLING, /*!< Invite sent, no answer */ - INV_PROCEEDING, /*!< We got/sent 1xx message */ - INV_EARLY_MEDIA, /*!< We got 18x message with to-tag back */ - INV_COMPLETED, /*!< Got final response with error. Wait for ACK, then CONFIRMED */ - INV_CONFIRMED, /*!< Confirmed response - we've got an ack (Incoming calls only) */ - INV_TERMINATED, /*!< Transaction done - either successful (AST_STATE_UP) or failed, but done - The only way out of this is a BYE from one side */ - INV_CANCELLED /*!< Transaction cancelled by client or server in non-terminated state */ + INV_NONE = 0, /*!< No state at all, maybe not an INVITE dialog */ + INV_CALLING = 1, /*!< Invite sent, no answer */ + INV_PROCEEDING = 2, /*!< We got/sent 1xx message */ + INV_EARLY_MEDIA = 3, /*!< We got 18x message with to-tag back */ + INV_COMPLETED = 4, /*!< Got final response with error. Wait for ACK, then CONFIRMED */ + INV_CONFIRMED = 5, /*!< Confirmed response - we've got an ack (Incoming calls only) */ + INV_TERMINATED = 6, /*!< Transaction done - either successful (AST_STATE_UP) or failed, but done + The only way out of this is a BYE from one side */ + INV_CANCELLED = 7, /*!< Transaction cancelled by client or server in non-terminated state */ }; /* Do _NOT_ make any changes to this enum, or the array following it; @@ -3413,7 +3413,7 @@ static int sip_hangup(struct ast_channel *ast) return 0; } /* If the call is not UP, we need to send CANCEL instead of BYE */ - if (ast->_state == AST_STATE_RING || ast->_state == AST_STATE_RINGING) { + if (p->invitestate < INV_COMPLETED) { needcancel = TRUE; if (option_debug > 3) ast_log(LOG_DEBUG, "Hanging up channel in state %s (not UP)\n", ast_state2str(ast->_state)); @@ -3434,7 +3434,7 @@ static int sip_hangup(struct ast_channel *ast) */ if (ast_test_flag(&p->flags[0], SIP_ALREADYGONE)) needdestroy = 1; /* Set destroy flag at end of this function */ - else + else if (p->invitestate != INV_CALLING) sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); /* Start the process if it's not already started */ @@ -3496,6 +3496,7 @@ static int sip_hangup(struct ast_channel *ast) but we can't send one while we have "INVITE" outstanding. */ ast_set_flag(&p->flags[0], SIP_PENDINGBYE); ast_clear_flag(&p->flags[0], SIP_NEEDREINVITE); + sip_cancel_destroy(p); } } } -- cgit v1.2.3