From d78064344a58241487e8f7a7fc0ece6115c69c26 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 16 Sep 2025 16:06:55 -0400 Subject: [PATCH] MT#63317 add SSRC mapping to kernel Change-Id: If3af2ff872be340be57a2c53c35fcf2d83af6587 --- daemon/media_socket.c | 6 ++++++ kernel-module/xt_RTPENGINE.c | 21 ++++++++++++++++----- kernel-module/xt_RTPENGINE.h | 1 + 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/daemon/media_socket.c b/daemon/media_socket.c index a8d197876..53c8c6704 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1695,6 +1695,12 @@ static const char *kernelize_target(kernelize_state *s, struct packet_stream *st s->ssrc[u] = se; // no reference needed reti->ssrc[u] = htonl(se->h.ssrc); reti->ssrc_stats[u] = se->stats; + reti->ssrc_media_idx[u] = -1u; + if (se->media) { + unsigned int media_idx = se->media->index - 1; + reti->ssrc_media_idx[u] = media_idx; + fill_media_sinks(s, media_idx, stream); + } u++; } diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index 303544fa7..c04eff735 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -1728,11 +1728,19 @@ static int proc_list_show(struct seq_file *f, void *v) { for (i = 0; i < ARRAY_SIZE(g->target.ssrc); i++) { if (!g->target.ssrc[i] || !g->target.ssrc_stats[i]) break; - seq_printf(f, "%s %lx [seq %u/%u]", - (i == 0) ? "" : ",", - (unsigned long) ntohl(g->target.ssrc[i]), - atomic_read(&g->target.ssrc_stats[i]->ext_seq), - atomic_read(&g->target.ssrc_stats[i]->rtcp_seq)); + if (g->target.ssrc_media_idx[i] == -1u) + seq_printf(f, "%s %lx [seq %u/%u]", + (i == 0) ? "" : ",", + (unsigned long) ntohl(g->target.ssrc[i]), + atomic_read(&g->target.ssrc_stats[i]->ext_seq), + atomic_read(&g->target.ssrc_stats[i]->rtcp_seq)); + else + seq_printf(f, "%s %lx [seq %u/%u #%u]", + (i == 0) ? "" : ",", + (unsigned long) ntohl(g->target.ssrc[i]), + atomic_read(&g->target.ssrc_stats[i]->ext_seq), + atomic_read(&g->target.ssrc_stats[i]->rtcp_seq), + g->target.ssrc_media_idx[i]); } seq_printf(f, "\n"); @@ -6483,6 +6491,9 @@ static unsigned int rtpengine46(struct sk_buff *skb, struct sk_buff *oskb, if (ssrc_idx == -2 || (ssrc_idx == -1 && g->target.ssrc_req)) goto out_error; + if (output_group_idx == -1u) + output_group_idx = g->target.ssrc_media_idx[ssrc_idx]; + pkt_idx = rtp_packet_index(&g->decrypt_rtp, &g->target.decrypt, rtp.rtp_header, ssrc_idx, g->target.ssrc_stats); errstr = "SRTP authentication tag mismatch"; diff --git a/kernel-module/xt_RTPENGINE.h b/kernel-module/xt_RTPENGINE.h index a5e1fff3c..81b768eb1 100644 --- a/kernel-module/xt_RTPENGINE.h +++ b/kernel-module/xt_RTPENGINE.h @@ -102,6 +102,7 @@ struct rtpengine_target_info { struct rtpengine_srtp decrypt; uint32_t ssrc[RTPE_NUM_SSRC_TRACKING]; // Expose the SSRC to userspace when we resync. struct ssrc_stats *ssrc_stats[RTPE_NUM_SSRC_TRACKING]; + unsigned int ssrc_media_idx[RTPE_NUM_PAYLOAD_TYPES]; // same idx as ssrc struct rtp_stats *pt_stats[RTPE_NUM_PAYLOAD_TYPES]; // must be sorted by PT unsigned int pt_media_idx[RTPE_NUM_PAYLOAD_TYPES]; // same idx as pt_stats