From 0ae0681b28b557e66316611cc22d924f3c320c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Ned=C5=BEibovi=C4=87?= Date: Tue, 2 Feb 2021 08:45:35 -0500 Subject: [PATCH] TT#14008 Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #1183 commit a74cf4a7f9d410b2c545c752eab3746c704363b7 Author: Damir Nedžibović Date: Tue Feb 2 11:06:50 2021 +0100 Add --dtmf-log-ng-tcp CLI option. commit a428764d9b1ae263f17da89edb1d46f8502aa334 Merge: 2bbfcb27 8abc6b1c Author: Damir Nedžibović Date: Tue Feb 2 09:16:26 2021 +0100 Merge branch 'master' into dtmf_events_over_ng_tcp commit 2bbfcb2750f704e478e90af18bdc52647310748f Author: Damir Nedžibović Date: Mon Feb 1 14:28:07 2021 +0100 Replace hex values with chars. commit dc1084d12219934618db4636b40b101072c644ce Merge: 2bce444b 2c7163ea Author: Damir Nedžibović Date: Mon Feb 1 13:53:27 2021 +0100 Merge branch 'dtmf_events_over_ng_tcp' of github.com:enreached/rtpengine into dtmf_events_over_ng_tcp commit 2bce444b263ead2e312ef07432baee3968fbd930 Author: Damir Nedžibović Date: Mon Feb 1 13:28:06 2021 +0100 Prevent use after free. commit 5a256fd3ae6c9ace55e0cfd5c4c2fbe9f4a15f1d Author: Damir Nedžibović Date: Fri Jan 29 13:30:31 2021 +0100 Add missing includes. commit a14f4034b90c2e228c4b65f02f6b3b1c2aecf96c Author: Damir Nedžibović Date: Fri Jan 29 13:27:27 2021 +0100 Add support for sending DTMF events via protocol NG TCP. commit b861fe30879a5799a1daa308e6e3e641ec011a75 Author: Damir Nedžibović Date: Thu Jan 28 18:09:10 2021 +0100 Add missing include. commit 7bfe08fb08bb1bbaf3db8ea8da16625d5eae5975 Author: Damir Nedžibović Date: Thu Jan 28 18:05:44 2021 +0100 Implementation of control-ng via TCP. commit 2c7163eaf3143cdac34700771075edc4be60f166 Merge: fd286813 9165bf1f Author: Damir Nedžibović Date: Mon Feb 1 13:49:00 2021 +0100 Merge branch 'dtmf_events_over_ng_tcp' of github.com:enreached/rtpengine into dtmf_events_over_ng_tcp commit fd28681350795f4afa206666bac0a5a1ed0ca2a1 Author: Richard Fuchs Date: Fri Jan 29 10:20:02 2021 -0500 TT#14008 fix AEAD kernel API for < 4.2 Untested whether it actually works closes #1176 Change-Id: If6398632ac62525a673b844cfb4ce842a8aa0346 commit 0626dcdd965a57a2305390ceef6c41849a9b94d4 Author: Richard Fuchs Date: Fri Jan 29 13:07:25 2021 -0500 TT#14008 improve log output for stray packets Change-Id: Ic4b03928b279aade761de3ba1646b5c27318e6a3 commit 8fcccb77cc84174a64eda426585d728e27bdacbb Author: Damir Nedžibović Date: Mon Feb 1 13:28:06 2021 +0100 Prevent use after free. commit f0d90d1831e877c943ed536b69e3d41a93058e53 Author: Damir Nedžibović Date: Fri Jan 29 13:30:31 2021 +0100 Add missing includes. commit 37462b8e4dd8763648fbe028d97697d75df1ed8c Author: Damir Nedžibović Date: Fri Jan 29 13:27:27 2021 +0100 Add support for sending DTMF events via protocol NG TCP. commit 9165bf1f75a6e38133ccebcd54cc2b61285fdcfd Author: Damir Nedžibović Date: Mon Feb 1 13:28:06 2021 +0100 Prevent use after free. commit d616f2941f34f8b5f217ef297ef95c42f7472fd7 Author: Damir Nedžibović Date: Fri Jan 29 13:30:31 2021 +0100 Add missing includes. commit bb063386c6cde380218d489dd7017334fc02611a Author: Damir Nedžibović Date: Fri Jan 29 13:27:27 2021 +0100 Add support for sending DTMF events via protocol NG TCP. commit b28ab07532679d4d952f335113b8f40a0d92b233 Merge: 813a4f1c 6e4373af Author: Damir Nedžibović Date: Fri Jan 29 09:21:31 2021 +0100 Merge branch 'control_ng_tcp' of github.com:enreached/rtpengine into control_ng_tcp commit 813a4f1caa3f0859401b2aedcd047283a0f0ca8c Author: Damir Nedžibović Date: Thu Jan 28 18:09:10 2021 +0100 Add missing include. commit 0c87a19c557efc3cc2fce59c5431a2a717d3a505 Author: Damir Nedžibović Date: Thu Jan 28 18:05:44 2021 +0100 Implementation of control-ng via TCP. commit 6e4373affb998f0e583243e649e89096e9b0a242 Merge: fbf74bfe 7799f23a Author: Damir Nedžibović Date: Fri Jan 29 09:19:46 2021 +0100 Merge branch 'control_ng_tcp' of github.com:enreached/rtpengine into control_ng_tcp commit fbf74bfe2d584323ecaf8aadd13b1cfdd8b59e02 Author: Richard Fuchs Date: Wed Jan 27 10:18:14 2021 -0500 TT#14008 fix possible segfault closes #1172 Change-Id: I94bb52c290c2032073e54528283660f03e694033 commit 1a5bcc09052594a36237936df2c20e756f307d0c Author: Richard Fuchs Date: Thu Jan 28 14:49:43 2021 -0500 TT#109251 fix redis restore segfault Change-Id: I501a47b065e7b8ff28a3ac157c0ce567f228557f commit b38b49fd60c7378dde45f853f9f11f89ba7f7d50 Author: Richard Fuchs Date: Thu Jan 28 13:44:44 2021 -0500 TT#102450 added tests for Ia9fa96cf Change-Id: Ic9728e12a012335c30c5640ac0b5c88e39ad24ed commit f33877bfe3135f5dbf4340e07a9dccd7f6ee680d Author: Richard Fuchs Date: Thu Jan 28 13:43:46 2021 -0500 TT#102450 fix some timestamping issues Make sure G.722 rate multiplies is applied in the right places Don't trust encoders to return proper timestamps, but instead track them explicitly based on frame duration Change-Id: Ia9fa96cf662da97159fa170c3a3f37516889e1bd commit 39a25b954dadfedc92dc1a7aa0df223fc261af3b Author: Richard Fuchs Date: Thu Jan 28 14:07:53 2021 -0500 TT#106101 mem leak fix for 554034eb7e Change-Id: I9c410211580d8513a203a29f898970a78175d08b commit 11d11aed907d60e435ca81c7694d0468e45a76e5 Author: Richard Fuchs Date: Thu Jan 28 13:41:28 2021 -0500 TT#14008 clean up some tests Looks like packet order can be an issue in some cases Change-Id: Ib8fb8c553c9d0f2919b24dda1e15e5a23832c619 commit 7799f23aa52a8341991057d0c2d1c59d22c60ae3 Merge: ba7ee9d6 e191e16c Author: Damir Nedžibović Date: Fri Jan 29 09:18:24 2021 +0100 Merge branch 'master' of https://github.com/sipwise/rtpengine into control_ng_tcp commit ba7ee9d6b1e9dc96c7430da9512d7be9ebea32f9 Merge: f805d881 ffe187f1 Author: Damir Nedžibović Date: Thu Jan 28 18:15:58 2021 +0100 Merge branch 'control_ng_tcp' of github.com:enreached/rtpengine into control_ng_tcp commit f805d881fa64cb581f14b11e7096e57b25ce670a Author: Damir Nedžibović Date: Thu Jan 28 18:09:10 2021 +0100 Add missing include. commit c548a3ca4be494532a8c14c55a5dcae69751572a Author: Damir Nedžibović Date: Thu Jan 28 18:05:44 2021 +0100 Implementation of control-ng via TCP. commit ffe187f1166c22f5d204c97534e786fdbfc10052 Author: Damir Nedžibović Date: Thu Jan 28 18:05:44 2021 +0100 Implementation of control-ng via TCP. Change-Id: I8383fa80bce59aa865009e34caff5263b97ab588 --- daemon/dtmf.c | 50 +++++++++++++++++++++++++++++++++++++++++--- daemon/main.c | 1 + daemon/rtpengine.pod | 5 +++++ include/main.h | 1 + 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/daemon/dtmf.c b/daemon/dtmf.c index 0fde9bae1..17b82811f 100644 --- a/daemon/dtmf.c +++ b/daemon/dtmf.c @@ -1,5 +1,7 @@ #include #include "dtmf.h" +#include "bencode.h" +#include "control_ng.h" #include "media_socket.h" #include "log.h" #include "call.h" @@ -9,17 +11,57 @@ #include "codec.h" #include "ssrc.h" - - static socket_t dtmf_log_sock; void dtmf_init(void) { + ilog(LOG_DEBUG, "log dtmf over ng %d", rtpe_config.dtmf_via_ng); if (rtpe_config.dtmf_udp_ep.port) { if (connect_socket(&dtmf_log_sock, SOCK_DGRAM, &rtpe_config.dtmf_udp_ep)) ilog(LOG_ERR, "Failed to open/connect DTMF logging socket: %s", strerror(errno)); } } +static void dtmf_bencode_and_notify(struct media_packet *mp, + struct telephone_event_payload *dtmf, int clockrate) +{ + bencode_buffer_t bencbuf; + bencode_item_t *notify, *data, *tags; + str encoded_data; + int ret = bencode_buffer_init(&bencbuf); + assert(ret == 0); + + if (!dtmf->end) + return; + + if (!clockrate) + clockrate = 8000; + + notify = bencode_dictionary(&bencbuf); + bencode_dictionary_add_string(notify, "notify", "onDTMF"); + data = bencode_dictionary_add_dictionary(notify, "data"); + tags = bencode_dictionary_add_list(data, "tags"); + + bencode_dictionary_add_string_len(data, "callid", mp->call->callid.s, mp->call->callid.len); + bencode_dictionary_add_string_len(data, "source_tag", mp->media->monologue->tag.s, mp->media->monologue->tag.len); + + GList *tag_values = g_hash_table_get_values(mp->call->tags); + for (GList *tag_it = tag_values; tag_it; tag_it = tag_it->next) { + struct call_monologue *ml = tag_it->data; + bencode_list_add_str(tags, &ml->tag); + } + g_list_free(tag_values); + + bencode_dictionary_add_string(data, "type", "DTMF"); + bencode_dictionary_add_string(data, "source_ip", sockaddr_print_buf(&mp->fsin.address)); + bencode_dictionary_add_integer(data, "timestamp", rtpe_now.tv_sec); + bencode_dictionary_add_integer(data, "event", dtmf->event); + bencode_dictionary_add_integer(data, "duration", (ntohs(dtmf->duration) * (1000000 / clockrate)) / 1000); + bencode_dictionary_add_integer(data, "volume", dtmf->volume); + + bencode_collapse_str(notify, &encoded_data); + notify_ng_tcp_clients(&encoded_data); + bencode_buffer_free(&bencbuf); +} static GString *dtmf_json_print(struct media_packet *mp, struct telephone_event_payload *dtmf, int clockrate) @@ -64,7 +106,7 @@ static GString *dtmf_json_print(struct media_packet *mp, } int dtmf_do_logging(void) { - if (_log_facility_dtmf || dtmf_log_sock.family) + if (_log_facility_dtmf || dtmf_log_sock.family || rtpe_config.dtmf_via_ng) return 1; return 0; } @@ -92,6 +134,8 @@ int dtmf_event(struct media_packet *mp, str *payload, int clockrate) { dtmflog(buf); if (dtmf_log_sock.family) send(dtmf_log_sock.fd, buf->str, buf->len, 0); + if (rtpe_config.dtmf_via_ng) + dtmf_bencode_and_notify(mp, dtmf, clockrate); g_string_free(buf, TRUE); ret = 1; // END event diff --git a/daemon/main.c b/daemon/main.c index bec3d985f..25957e838 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -431,6 +431,7 @@ static void options(int *argc, char ***argv) { #ifdef WITH_TRANSCODING { "log-facility-dtmf",0, 0, G_OPTION_ARG_STRING, &log_facility_dtmf_s, "Syslog facility to use for logging DTMF", "daemon|local0|...|local7"}, { "dtmf-log-dest", 0,0, G_OPTION_ARG_STRING, &dtmf_udp_ep, "Destination address for DTMF logging via UDP", "IP46|HOSTNAME:PORT" }, + { "dtmf-log-ng-tcp", 0,0, G_OPTION_ARG_NONE, &rtpe_config.dtmf_via_ng, "DTMF logging via TCP NG protocol", NULL }, #endif { "log-format", 0, 0, G_OPTION_ARG_STRING, &log_format, "Log prefix format", "default|parsable"}, { "xmlrpc-format",'x', 0, G_OPTION_ARG_INT, &rtpe_config.fmt, "XMLRPC timeout request format to use. 0: SEMS DI, 1: call-id only, 2: Kamailio", "INT" }, diff --git a/daemon/rtpengine.pod b/daemon/rtpengine.pod index 8460a3dd0..716c54e27 100644 --- a/daemon/rtpengine.pod +++ b/daemon/rtpengine.pod @@ -274,6 +274,11 @@ to the feature enabled by B<--log-facilty-dtmf>, but instead of writing detected DTMF events to syslog, this sends the JSON payload to the given address as UDP packets. +=item B<--dtmf-log-ng-tcp> + +If B<--listen-tcp-ng> is enabled, this will send DTMF events to all +connected cliens encoded in bencode format. + =item B<--log-srtp-keys> Write SRTP keys to error log instead of debug log. diff --git a/include/main.h b/include/main.h index 067e1e190..1edb10697 100644 --- a/include/main.h +++ b/include/main.h @@ -96,6 +96,7 @@ struct rtpengine_config { char *mysql_pass; char *mysql_query; endpoint_t dtmf_udp_ep; + int dtmf_via_ng; enum endpoint_learning endpoint_learning; int jb_length; int jb_clock_drift;