From 8fc168784f45987d7c1aecde57fa34581ed5ff7a Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 13 Mar 2023 12:24:43 -0400 Subject: [PATCH] MT#56861 support RTP seq no adjustments in kernel DTMF requires the "end" event to be sent multiple times, requiring sequence number adjustments after DTMF injection has finished. Add support for this to the kernel module. Change-Id: Ie5c8f18eda39553a6ebbdd35ef2341be01f2a59f --- daemon/media_socket.c | 8 ++++++-- kernel-module/xt_RTPENGINE.c | 27 ++++++++++++++------------- kernel-module/xt_RTPENGINE.h | 1 + 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/daemon/media_socket.c b/daemon/media_socket.c index e3d32d81a..34101da6e 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1545,9 +1545,13 @@ output: __re_address_translate_ep(&redi->output.dst_addr, &sink->endpoint); __re_address_translate_ep(&redi->output.src_addr, &sink->selected_sfd->socket.local); - if (redi->output.ssrc_subst) { + + if (reti->track_ssrc) { for (unsigned int u = 0; u < G_N_ELEMENTS(stream->ssrc_in); u++) { - if (stream->ssrc_in[u]) + if (sink->ssrc_out[u]) + redi->output.seq_offset[u] = sink->ssrc_out[u]->parent->seq_diff; + + if (redi->output.ssrc_subst && stream->ssrc_in[u]) redi->output.ssrc_out[u] = htonl(stream->ssrc_in[u]->ssrc_map_out); } } diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index 979a82b9c..fb6121c7e 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -1708,17 +1708,14 @@ static int proc_list_show(struct seq_file *f, void *v) { (unsigned long long) atomic64_read(&o->stats_out.packets), (unsigned long long) atomic64_read(&o->stats_out.errors)); - if (o->output.ssrc_subst) { - seq_printf(f, " SSRC out:"); - for (j = 0; j < ARRAY_SIZE(o->output.ssrc_out); j++) { - if (!o->output.ssrc_out[j]) - break; - seq_printf(f, "%s %lx", - (j == 0) ? "" : ",", - (unsigned long) ntohl(o->output.ssrc_out[j])); - } - seq_printf(f, "\n"); + seq_printf(f, " SSRC out:"); + for (j = 0; j < ARRAY_SIZE(o->output.ssrc_out); j++) { + seq_printf(f, "%s %lx [seq +%u]", + (j == 0) ? "" : ",", + (unsigned long) ntohl(o->output.ssrc_out[j]), + (unsigned int) o->output.seq_offset[j]); } + seq_printf(f, "\n"); for (j = 0; j < g->target.num_payload_types; j++) { if (o->output.pt_output[j].replace_pattern_len) @@ -4857,9 +4854,13 @@ no_intercept: } if (rtp2.ok) { - // SSRC substitution - if (o->output.ssrc_subst && ssrc_idx != -1 && o->output.ssrc_out[ssrc_idx]) - rtp2.header->ssrc = o->output.ssrc_out[ssrc_idx]; + // SSRC substitution and seq manipulation + if (ssrc_idx != -1) { + rtp2.header->seq_num = htons(ntohs(rtp2.header->seq_num) + + o->output.seq_offset[ssrc_idx]); + if (o->output.ssrc_subst && o->output.ssrc_out[ssrc_idx]) + rtp2.header->ssrc = o->output.ssrc_out[ssrc_idx]; + } pkt_idx = packet_index(&o->encrypt, &o->output.encrypt, rtp2.header, ssrc_idx); pllen = rtp2.payload_len; diff --git a/kernel-module/xt_RTPENGINE.h b/kernel-module/xt_RTPENGINE.h index a892a268b..c6c96c34c 100644 --- a/kernel-module/xt_RTPENGINE.h +++ b/kernel-module/xt_RTPENGINE.h @@ -134,6 +134,7 @@ struct rtpengine_output_info { struct rtpengine_srtp encrypt; uint32_t ssrc_out[RTPE_NUM_SSRC_TRACKING]; // Rewrite SSRC + uint32_t seq_offset[RTPE_NUM_SSRC_TRACKING]; // Rewrite output seq struct rtpengine_pt_output pt_output[RTPE_NUM_PAYLOAD_TYPES]; // same indexes as pt_input unsigned char tos;