channels/chan_pjsip: fix HANGUPCAUSE function bug.
authorAaron An <anjb@ti-net.com.cn>
Thu, 22 Sep 2016 06:40:45 +0000 (14:40 +0800)
committerAaron An <anjb@ti-net.com.cn>
Thu, 22 Sep 2016 06:42:39 +0000 (14:42 +0800)
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

index 02da0db..00d4a14 100644 (file)
@@ -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)