res_hep_pjsip: Use the channel name instead of the call ID when it is available
authorMatthew Jordan <mjordan@digium.com>
Thu, 10 Apr 2014 21:28:08 +0000 (21:28 +0000)
committerMatthew Jordan <mjordan@digium.com>
Thu, 10 Apr 2014 21:28:08 +0000 (21:28 +0000)
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

index 101eb6b..54c2121 100644 (file)
@@ -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>
 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);