summaryrefslogtreecommitdiff
path: root/channels/chan_pjsip.c
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2014-07-07 01:22:44 +0000
committerKinsey Moore <kmoore@digium.com>2014-07-07 01:22:44 +0000
commitedcaa54019a14cdfd2d5e8453b15a52819cecb36 (patch)
treee6f9a48d1073ace332736bd64a25fd04f913b51f /channels/chan_pjsip.c
parent9c589571b7b403d14d5af685fe7f531651317fa6 (diff)
CEL: Fix incorrect/missing extra field information
This corrects two issues with the extra field information in Asterisk 12+ in channel event logs. It is possible to inject custom values into the dialstatus provided by ast_channel_dial_type() Stasis messages that fall outside the enumeration allowed for the DIALSTATUS channel variable. CEL now filters for the allowed values and ignores other values. The "hangupsource" extra field key is always blank if the far end channel is a chan_pjsip channel. This is because the hangupsource is never set for the pjsip channel driver. This change sets the hangupsource whenever a hangup is queued for chan_pjsip channels. This corrects an issue with the pjsip channel driver where the hangupcause information was not being set properly. Review: https://reviewboard.asterisk.org/r/3690/ ........ Merged revisions 418071 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@418084 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_pjsip.c')
-rw-r--r--channels/chan_pjsip.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index ee033b511..e55c48835 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -1510,6 +1510,7 @@ static int call(void *data)
int res = ast_sip_session_create_invite(session, &tdata);
if (res) {
+ ast_set_hangupsource(session->channel, ast_channel_name(session->channel), 0);
ast_queue_hangup(session->channel);
} else {
update_initial_connected_line(session);
@@ -1945,6 +1946,7 @@ static void chan_pjsip_session_end(struct ast_sip_session *session)
chan_pjsip_remove_hold(ast_channel_uniqueid(session->channel));
+ ast_set_hangupsource(session->channel, ast_channel_name(session->channel), 0);
if (!ast_channel_hangupcause(session->channel) && session->inv_session) {
int cause = hangup_sip2cause(session->inv_session->cause);
@@ -2072,6 +2074,8 @@ static struct ast_sip_session_supplement pbx_start_supplement = {
static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
{
struct pjsip_status_line status = rdata->msg_info.msg->line.status;
+ struct ast_control_pvt_cause_code *cause_code;
+ int data_size = sizeof(*cause_code);
if (!session->channel) {
return;
@@ -2095,6 +2099,21 @@ 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)