summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2014-04-10 21:28:08 +0000
committerMatthew Jordan <mjordan@digium.com>2014-04-10 21:28:08 +0000
commit0c1342bd2bc70138aed865efe8289d27c54580dc (patch)
tree18411f56d075e949845923542629e5ff11796859
parent6905ac0f5e80f0434395bb9c07883cb6547fac36 (diff)
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
-rw-r--r--res/res_hep_pjsip.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/res/res_hep_pjsip.c b/res/res_hep_pjsip.c
index 101eb6bdb..54c212111 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);