diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 02da0db35b15174db66cf1810f374dfc6df603ff..00d4a1452fd34f3bc120ea539ae61721f74baf54 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)