diff options
author | Aaron An <anjb@ti-net.com.cn> | 2016-09-22 14:40:45 +0800 |
---|---|---|
committer | George Joseph <gjoseph@digium.com> | 2016-09-23 14:11:05 -0500 |
commit | a0a17a8c6f92cea38afb234d2f8b6cb4e3883424 (patch) | |
tree | 96273b4ed2a497c261548e930a3a02331fd80391 | |
parent | 7cce1a781754820ce889426287765df39c60d083 (diff) |
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
-rw-r--r-- | channels/chan_pjsip.c | 30 |
1 files changed, 15 insertions, 15 deletions
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) |