From 0c1342bd2bc70138aed865efe8289d27c54580dc Mon Sep 17 00:00:00 2001 From: Matthew Jordan <mjordan@digium.com> Date: Thu, 10 Apr 2014 21:28:08 +0000 Subject: [PATCH] res_hep_pjsip: Use the channel name instead of the call ID when it is available During discussions with Alexandr Dubovikov at Kamailio World, it became apparent that while the SIP call ID is a useful identifier prior to an Asterisk channel being created, it is far more preferable to use the channel name (or some channel based identifier) when the channel is available. Homer is smart enough to tie the various messages together. This patch opts to use the channel name when it is available, falling back to the call ID otherwise. ........ Merged revisions 412088 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@412089 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_hep_pjsip.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/res/res_hep_pjsip.c b/res/res_hep_pjsip.c index 101eb6bdb8..54c212111e 100644 --- a/res/res_hep_pjsip.c +++ b/res/res_hep_pjsip.c @@ -27,6 +27,7 @@ /*** MODULEINFO <depend>pjproject</depend> <depend>res_pjsip</depend> + <depend>res_pjsip_session</depend> <depend>res_hep</depend> <defaultenabled>no</defaultenabled> <support_level>extended</support_level> @@ -37,12 +38,37 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include <pjsip.h> +#include <pjsip_ua.h> +#include <pjlib.h> #include "asterisk/res_pjsip.h" +#include "asterisk/res_pjsip_session.h" #include "asterisk/res_hep.h" #include "asterisk/module.h" #include "asterisk/netsock2.h" +static char *assign_uuid(const pj_str_t *call_id, const pj_str_t *local_tag, const pj_str_t *remote_tag) +{ + RAII_VAR(struct ast_sip_session *, session, NULL, ao2_cleanup); + pjsip_dialog *dlg; + char *uuid = NULL; + + if ((dlg = pjsip_ua_find_dialog(call_id, local_tag, remote_tag, PJ_FALSE)) + && (session = ast_sip_dialog_get_session(dlg)) + && (session->channel)) { + + uuid = ast_strdup(ast_channel_name(session->channel)); + } else { + + uuid = ast_malloc(pj_strlen(call_id) + 1); + if (uuid) { + ast_copy_pj_str(uuid, call_id, pj_strlen(call_id) + 1); + } + } + + return uuid; +} + static pj_status_t logging_on_tx_msg(pjsip_tx_data *tdata) { char local_buf[256]; @@ -50,6 +76,8 @@ static pj_status_t logging_on_tx_msg(pjsip_tx_data *tdata) char *uuid; struct hepv3_capture_info *capture_info; pjsip_cid_hdr *cid_hdr; + pjsip_from_hdr *from_hdr; + pjsip_to_hdr *to_hdr; capture_info = hepv3_create_capture_info(tdata->buf.start, (size_t)(tdata->buf.cur - tdata->buf.start)); if (!capture_info) { @@ -60,12 +88,14 @@ static pj_status_t logging_on_tx_msg(pjsip_tx_data *tdata) pj_sockaddr_print(&tdata->tp_info.dst_addr, remote_buf, sizeof(remote_buf), 3); cid_hdr = PJSIP_MSG_CID_HDR(tdata->msg); - uuid = ast_malloc(pj_strlen(&cid_hdr->id) + 1); + from_hdr = PJSIP_MSG_FROM_HDR(tdata->msg); + to_hdr = PJSIP_MSG_TO_HDR(tdata->msg); + + uuid = assign_uuid(&cid_hdr->id, &to_hdr->tag, &from_hdr->tag); if (!uuid) { ao2_ref(capture_info, -1); return PJ_SUCCESS; } - ast_copy_pj_str(uuid, &cid_hdr->id, pj_strlen(&cid_hdr->id) + 1); ast_sockaddr_parse(&capture_info->src_addr, local_buf, PARSE_PORT_REQUIRE); ast_sockaddr_parse(&capture_info->dst_addr, remote_buf, PARSE_PORT_REQUIRE); @@ -95,12 +125,11 @@ static pj_bool_t logging_on_rx_msg(pjsip_rx_data *rdata) pj_sockaddr_print(&rdata->tp_info.transport->local_addr, local_buf, sizeof(local_buf), 3); pj_sockaddr_print(&rdata->pkt_info.src_addr, remote_buf, sizeof(remote_buf), 3); - uuid = ast_malloc(pj_strlen(&rdata->msg_info.cid->id) + 1); + uuid = assign_uuid(&rdata->msg_info.cid->id, &rdata->msg_info.to->tag, &rdata->msg_info.from->tag); if (!uuid) { ao2_ref(capture_info, -1); return PJ_SUCCESS; } - ast_copy_pj_str(uuid, &rdata->msg_info.cid->id, pj_strlen(&rdata->msg_info.cid->id) + 1); ast_sockaddr_parse(&capture_info->src_addr, remote_buf, PARSE_PORT_REQUIRE); ast_sockaddr_parse(&capture_info->dst_addr, local_buf, PARSE_PORT_REQUIRE);