From a0a17a8c6f92cea38afb234d2f8b6cb4e3883424 Mon Sep 17 00:00:00 2001 From: Aaron An Date: Thu, 22 Sep 2016 14:40:45 +0800 Subject: channels/chan_pjsip: fix HANGUPCAUSE function bug. HANGUPCAUSE not return 'SIP 200 Ok' when dialed channel answered. This patch change the call order of ast_queue_control_data and ast_queue_control in chan_pjsip_incoming_response. ASTERISK-26396 #close Reported by: AaronAn Tested by: AaronAn Change-Id: Ide2d31723d8d425961e985de7de625694580be61 --- channels/chan_pjsip.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'channels') diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 82f716f08..23545112e 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -2321,6 +2321,21 @@ static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct return; } + /* Build and send the tech-specific cause information */ + /* size of the string making up the cause code is "SIP " number + " " + reason length */ + data_size += 4 + 4 + pj_strlen(&status.reason); + cause_code = ast_alloca(data_size); + memset(cause_code, 0, data_size); + + ast_copy_string(cause_code->chan_name, ast_channel_name(session->channel), AST_CHANNEL_NAME); + + snprintf(cause_code->code, data_size - sizeof(*cause_code) + 1, "SIP %d %.*s", status.code, + (int) pj_strlen(&status.reason), pj_strbuf(&status.reason)); + + cause_code->ast_cause = hangup_sip2cause(status.code); + ast_queue_control_data(session->channel, AST_CONTROL_PVT_CAUSE_CODE, cause_code, data_size); + ast_channel_hangupcause_hash_set(session->channel, cause_code, data_size); + switch (status.code) { case 180: ast_queue_control(session->channel, AST_CONTROL_RINGING); @@ -2339,21 +2354,6 @@ static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct default: break; } - - /* Build and send the tech-specific cause information */ - /* size of the string making up the cause code is "SIP " number + " " + reason length */ - data_size += 4 + 4 + pj_strlen(&status.reason); - cause_code = ast_alloca(data_size); - memset(cause_code, 0, data_size); - - ast_copy_string(cause_code->chan_name, ast_channel_name(session->channel), AST_CHANNEL_NAME); - - snprintf(cause_code->code, data_size - sizeof(*cause_code) + 1, "SIP %d %.*s", status.code, - (int) pj_strlen(&status.reason), pj_strbuf(&status.reason)); - - cause_code->ast_cause = hangup_sip2cause(status.code); - ast_queue_control_data(session->channel, AST_CONTROL_PVT_CAUSE_CODE, cause_code, data_size); - ast_channel_hangupcause_hash_set(session->channel, cause_code, data_size); } static int chan_pjsip_incoming_ack(struct ast_sip_session *session, struct pjsip_rx_data *rdata) -- cgit v1.2.3