summaryrefslogtreecommitdiff
path: root/channels/chan_pjsip.c
diff options
context:
space:
mode:
authorAaron An <anjb@ti-net.com.cn>2016-09-22 14:40:45 +0800
committerAaron An <anjb@ti-net.com.cn>2016-09-22 14:42:39 +0800
commit18a8ca06eb22b38c90c2407625f4156c500995dd (patch)
tree96f27984808569a7cd94b96ffe6f835aecab2f62 /channels/chan_pjsip.c
parent9ef0eb6487bafe9aaefdad8d6c864f00d2a19282 (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
Diffstat (limited to 'channels/chan_pjsip.c')
-rw-r--r--channels/chan_pjsip.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 02da0db35..00d4a1452 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -2370,6 +2370,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);
@@ -2388,21 +2403,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)