summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES10
-rw-r--r--configs/samples/hep.conf.sample4
-rw-r--r--include/asterisk/res_hep.h14
-rw-r--r--res/res_hep.c37
-rw-r--r--res/res_hep.exports.in1
-rw-r--r--res/res_hep_pjsip.c9
-rw-r--r--res/res_hep_rtcp.c33
7 files changed, 105 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index 965b1b4be..5b3864953 100644
--- a/CHANGES
+++ b/CHANGES
@@ -26,6 +26,16 @@ res_pjsip
into the "reg_server" field in the ps_contacts table to facilitate
multi-server setups.
+res_hep
+------------------
+ * Added a new option, 'uuid_type', that sets the preferred source of the Homer
+ correlation UUID. The valid options are:
+ - call-id: Use the PJSIP SIP Call-ID header value
+ - channel: Use the Asterisk channel name
+ The default value is 'call-id'. In the event that a HEP module cannot find a
+ valid value using the specified 'uuid_type', the module may fallback to a
+ more readily available source for the correlation UUID.
+
app_confbridge
------------------
* Added a bridge profile option called regcontext that allows you to
diff --git a/configs/samples/hep.conf.sample b/configs/samples/hep.conf.sample
index 40b17aa0e..6e409d151 100644
--- a/configs/samples/hep.conf.sample
+++ b/configs/samples/hep.conf.sample
@@ -13,4 +13,8 @@ capture_password = foo ; If specified, the authorization passsword
capture_id = 1234 ; A unique integer identifier for this
; server. This ID will be embedded sent
; with each packet from this server.
+uuid_type = call-id ; Specify the preferred source for the Homer
+ ; correlation UUID. Valid options are:
+ ; - 'call-id' for the PJSIP SIP Call-ID
+ ; - 'channel' for the Asterisk channel name
diff --git a/include/asterisk/res_hep.h b/include/asterisk/res_hep.h
index 8839fd60a..bd0129eea 100644
--- a/include/asterisk/res_hep.h
+++ b/include/asterisk/res_hep.h
@@ -49,6 +49,11 @@ enum hepv3_capture_type {
HEPV3_CAPTURE_TYPE_IAX = 0x10,
};
+enum hep_uuid_type {
+ HEP_UUID_TYPE_CALL_ID = 0,
+ HEP_UUID_TYPE_CHANNEL,
+};
+
/*! \brief HEPv3 Capture Info */
struct hepv3_capture_info {
/*! The source address of the packet */
@@ -104,6 +109,15 @@ struct hepv3_capture_info *hepv3_create_capture_info(const void *payload, size_t
*/
int hepv3_send_packet(struct hepv3_capture_info *capture_info);
+/*!
+ * \brief Get the preferred UUID type
+ *
+ * \since 13.10.0
+ *
+ * \retval The type of UUID the packet should use
+ */
+enum hep_uuid_type hepv3_get_uuid_type(void);
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
diff --git a/res/res_hep.c b/res/res_hep.c
index 69a8ab391..723b27df8 100644
--- a/res/res_hep.c
+++ b/res/res_hep.c
@@ -60,6 +60,15 @@
</enumlist>
</description>
</configOption>
+ <configOption name="uuid_type" default="call-id">
+ <synopsis>The preferred type of UUID to pass to Homer.</synopsis>
+ <description>
+ <enumlist>
+ <enum name="call-id"><para>Use the PJSIP Call-Id</para></enum>
+ <enum name="channel"><para>Use the Asterisk channel name</para></enum>
+ </enumlist>
+ </description>
+ </configOption>
<configOption name="capture_address" default="192.168.1.1:9061">
<synopsis>The address and port of the Homer server to send packets to.</synopsis>
</configOption>
@@ -231,6 +240,7 @@ struct hep_generic {
struct hepv3_global_config {
unsigned int enabled; /*!< Whether or not sending is enabled */
unsigned int capture_id; /*!< Capture ID for this agent */
+ enum hep_uuid_type uuid_type; /*!< The preferred type of the UUID */
AST_DECLARE_STRING_FIELDS(
AST_STRING_FIELD(capture_address); /*!< Address to send to */
AST_STRING_FIELD(capture_password); /*!< Password for Homer server */
@@ -329,6 +339,25 @@ static void *module_config_alloc(void)
return config;
}
+/*! \brief Handler for the uuid_type attribute */
+static int uuid_type_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
+{
+ struct hepv3_global_config *global_config = obj;
+
+ if (strcasecmp(var->name, "uuid_type")) {
+ return -1;
+ }
+
+ if (!strcasecmp(var->value, "channel")) {
+ global_config->uuid_type = HEP_UUID_TYPE_CHANNEL;
+ } else if (!strcasecmp(var->value, "call-id")) {
+ global_config->uuid_type = HEP_UUID_TYPE_CALL_ID;
+ } else {
+ return -1;
+ }
+ return 0;
+}
+
/*! \brief HEPv3 run-time data destructor */
static void hepv3_data_dtor(void *obj)
{
@@ -376,6 +405,13 @@ static void capture_info_dtor(void *obj)
ast_free(info->payload);
}
+enum hep_uuid_type hepv3_get_uuid_type(void)
+{
+ RAII_VAR(struct module_config *, config, ao2_global_obj_ref(global_config), ao2_cleanup);
+
+ return config->general->uuid_type;
+}
+
struct hepv3_capture_info *hepv3_create_capture_info(const void *payload, size_t len)
{
struct hepv3_capture_info *info;
@@ -607,6 +643,7 @@ static int load_module(void)
aco_option_register(&cfg_info, "capture_address", ACO_EXACT, global_options, DEFAULT_HEP_SERVER, OPT_STRINGFIELD_T, 0, STRFLDSET(struct hepv3_global_config, capture_address));
aco_option_register(&cfg_info, "capture_password", ACO_EXACT, global_options, "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct hepv3_global_config, capture_password));
aco_option_register(&cfg_info, "capture_id", ACO_EXACT, global_options, "0", OPT_UINT_T, 0, STRFLDSET(struct hepv3_global_config, capture_id));
+ aco_option_register_custom(&cfg_info, "uuid_type", ACO_EXACT, global_options, "call-id", uuid_type_handler, 0);
if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) {
goto error;
diff --git a/res/res_hep.exports.in b/res/res_hep.exports.in
index d09d3f409..df0f2b4f7 100644
--- a/res/res_hep.exports.in
+++ b/res/res_hep.exports.in
@@ -2,6 +2,7 @@
global:
LINKER_SYMBOL_PREFIX*hepv3_send_packet;
LINKER_SYMBOL_PREFIX*hepv3_create_capture_info;
+ LINKER_SYMBOL_PREFIX*hepv3_get_uuid_type;
local:
*;
};
diff --git a/res/res_hep_pjsip.c b/res/res_hep_pjsip.c
index b5cf0b81e..caffd2563 100644
--- a/res/res_hep_pjsip.c
+++ b/res/res_hep_pjsip.c
@@ -51,13 +51,18 @@ static char *assign_uuid(const pj_str_t *call_id, const pj_str_t *local_tag, con
RAII_VAR(struct ast_sip_session *, session, NULL, ao2_cleanup);
pjsip_dialog *dlg;
char *uuid = NULL;
+ enum hep_uuid_type uuid_type = hepv3_get_uuid_type();
- if ((dlg = pjsip_ua_find_dialog(call_id, local_tag, remote_tag, PJ_FALSE))
+ if ((uuid_type == HEP_UUID_TYPE_CHANNEL)
+ && (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 {
+ }
+
+ /* If we couldn't get the channel or we never wanted it, default to the call-id */
+ if (!uuid) {
uuid = ast_malloc(pj_strlen(call_id) + 1);
if (uuid) {
diff --git a/res/res_hep_rtcp.c b/res/res_hep_rtcp.c
index 787512bbf..49a92539f 100644
--- a/res/res_hep_rtcp.c
+++ b/res/res_hep_rtcp.c
@@ -36,6 +36,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/res_hep.h"
#include "asterisk/module.h"
#include "asterisk/netsock2.h"
+#include "asterisk/channel.h"
+#include "asterisk/pbx.h"
#include "asterisk/stasis.h"
#include "asterisk/rtp_engine.h"
#include "asterisk/json.h"
@@ -43,6 +45,35 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
static struct stasis_subscription *stasis_rtp_subscription;
+static char *assign_uuid(struct ast_json *json_channel)
+{
+ const char *channel_name = ast_json_string_get(ast_json_object_get(json_channel, "name"));
+ enum hep_uuid_type uuid_type = hepv3_get_uuid_type();
+ char *uuid = NULL;
+
+ if (!channel_name) {
+ return NULL;
+ }
+
+ if (uuid_type == HEP_UUID_TYPE_CALL_ID && ast_begins_with(channel_name, "PJSIP")) {
+ struct ast_channel *chan = ast_channel_get_by_name(channel_name);
+ char buf[128];
+
+ if (chan && !ast_func_read(chan, "CHANNEL(pjsip,call-id)", buf, sizeof(buf))) {
+ uuid = ast_strdup(buf);
+ }
+
+ ast_channel_cleanup(chan);
+ }
+
+ /* If we couldn't get the call-id or didn't want it, just use the channel name */
+ if (!uuid) {
+ uuid = ast_strdup(channel_name);
+ }
+
+ return uuid;
+}
+
static void rtcp_message_handler(struct stasis_message *message)
{
@@ -94,7 +125,7 @@ static void rtcp_message_handler(struct stasis_message *message)
ast_sockaddr_parse(&capture_info->src_addr, ast_json_string_get(from), PARSE_PORT_REQUIRE);
ast_sockaddr_parse(&capture_info->dst_addr, ast_json_string_get(to), PARSE_PORT_REQUIRE);
- capture_info->uuid = ast_strdup(ast_json_string_get(ast_json_object_get(json_channel, "name")));
+ capture_info->uuid = assign_uuid(json_channel);
if (!capture_info->uuid) {
ao2_ref(capture_info, -1);
return;