From fdcee65ab73bbaec4495ad9e936c8246c5ef9a74 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 28 Apr 2025 13:01:50 -0400 Subject: [PATCH] MT#55283 tag transform call IDs/tags Change-Id: I79eabb46e66db3df03a3cee169690de70d9166ff --- daemon/codec.c | 15 ++++++++++++++- t/auto-daemon-tests-transcode-config.pl | 10 ++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 7adf8875c..bc70a54fb 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -613,6 +613,7 @@ static const char *__make_transform_handler(struct codec_handler *handler) { __auto_type tfh = handler->transform; __auto_type media = handler->media; + __auto_type ml = media->monologue; __auto_type call = media->call; if (tfh) { @@ -655,7 +656,19 @@ static const char *__make_transform_handler(struct codec_handler *handler) { } // manually construct the request - g_autoptr(GString) req = g_string_new("d7:command9:transform5:mediald4:type"); + g_autoptr(GString) req = g_string_new("d7:command9:transform7:call-id"); + + char rand_tag[9]; + rand_hex_str(rand_tag, 4); + g_string_append_printf(req, "%zu:%.*s for " STR_FORMAT, 8 + 1 + 3 + call->callid.len + 1, + 8, rand_tag, STR_FMT(&call->callid)); + + g_string_append(req, "8:from-tag"); + + g_string_append_printf(req, "%zu:%.*s for " STR_FORMAT, 8 + 1 + 3 + ml->tag.len + 1, + 8, rand_tag, STR_FMT(&ml->tag)); + + g_string_append(req, "5:mediald4:type"); BENC_GS_APPEND(&media->type); g_string_append(req, "5:codecld5:inputd5:codec"); diff --git a/t/auto-daemon-tests-transcode-config.pl b/t/auto-daemon-tests-transcode-config.pl index 56499c88d..d7f5d8f75 100755 --- a/t/auto-daemon-tests-transcode-config.pl +++ b/t/auto-daemon-tests-transcode-config.pl @@ -167,7 +167,8 @@ SDP rcv_no($sock_sig); $NGCP::Rtpengine::req_cb = sub { - ($port_sig, $addr_sig, $cookie, $port_tc) = rcv($sock_sig, -1, qr/^(.{16}) d7:command9:transform5:mediald4:type5:audio5:codecld5:inputd5:codec4:PCMA12:payload typei8e10:clock ratei8000e8:channelsi1e6:format0:7:options0:e6:outputd5:codec4:PCMU12:payload typei0e10:clock ratei8000e8:channelsi1e6:format0:7:options0:eee11:destinationd6:family3:IP47:address11:203.0.113.14:porti(\d{5})eeee8:instance12:.{12}e$/); + my ($cid, $tag); + ($port_sig, $addr_sig, $cookie, $cid, $tag, $port_tc) = rcv($sock_sig, -1, qr/^(.{16}) d7:command9:transform7:call-id\d+:(\w{8} for .*?)8:from-tag\d+:(\w{8} for .*?)5:mediald4:type5:audio5:codecld5:inputd5:codec4:PCMA12:payload typei8e10:clock ratei8000e8:channelsi1e6:format0:7:options0:e6:outputd5:codec4:PCMU12:payload typei0e10:clock ratei8000e8:channelsi1e6:format0:7:options0:eee11:destinationd6:family3:IP47:address11:203.0.113.14:porti(\d{5})eeee8:instance12:.{12}e$/); snd($sock_sig, $port_sig, $cookie . ' ' . Bencode::bencode( { result => 'ok', 'call-id' => 'foobar', @@ -249,11 +250,12 @@ $NGCP::Rtpengine::req_cb = undef; $NGCP::Rtpengine::req_cb = sub { - ($port_sig, $addr_sig, $cookie, $port_tc) = rcv($sock_sig, -1, qr/^(.{16}) d7:command9:transform5:mediald4:type5:audio5:codecld5:inputd5:codec4:PCMA12:payload typei8e10:clock ratei8000e8:channelsi1e6:format0:7:options0:e6:outputd5:codec4:PCMU12:payload typei0e10:clock ratei8000e8:channelsi1e6:format0:7:options0:eee11:destinationd6:family3:IP47:address11:203.0.113.14:porti(\d{5})eeee8:instance12:.{12}e$/); + my ($cid, $tag); + ($port_sig, $addr_sig, $cookie, $cid, $tag, $port_tc) = rcv($sock_sig, -1, qr/^(.{16}) d7:command9:transform7:call-id\d+:(\w{8} for .*?)8:from-tag\d+:(\w{8} for .*?)5:mediald4:type5:audio5:codecld5:inputd5:codec4:PCMA12:payload typei8e10:clock ratei8000e8:channelsi1e6:format0:7:options0:e6:outputd5:codec4:PCMU12:payload typei0e10:clock ratei8000e8:channelsi1e6:format0:7:options0:eee11:destinationd6:family3:IP47:address11:203.0.113.14:porti(\d{5})eeee8:instance12:.{12}e$/); snd($sock_sig, $port_sig, $cookie . ' ' . Bencode::bencode( { result => 'ok', - 'call-id' => 'foobar', - 'from-tag' => 'yolo', + 'call-id' => $cid, + 'from-tag' => $tag, 'media' => [ { id => 'id',