Browse Source

TT#83150 fix SSRC substitution w/ SRTP in kernel

closes #1005

Change-Id: I91336b09d419991b43880162fda21a8157492217
(cherry picked from commit d97a05647d)
changes/97/40697/1
Richard Fuchs 6 years ago
parent
commit
3d8c214975
1 changed files with 37 additions and 4 deletions
  1. +37
    -4
      kernel-module/xt_RTPENGINE.c

+ 37
- 4
kernel-module/xt_RTPENGINE.c View File

@ -1486,11 +1486,40 @@ static void proc_list_crypto_print(struct seq_file *f, struct re_crypto_context
struct rtpengine_srtp *s, const char *label) struct rtpengine_srtp *s, const char *label)
{ {
int hdr = 0; int hdr = 0;
int i;
if (c->cipher && c->cipher->id != REC_NULL) { if (c->cipher && c->cipher->id != REC_NULL) {
if (!hdr++) if (!hdr++)
seq_printf(f, " SRTP %s parameters:\n", label); seq_printf(f, " SRTP %s parameters:\n", label);
seq_printf(f, " cipher: %s\n", c->cipher->name ? : "<invalid>"); seq_printf(f, " cipher: %s\n", c->cipher->name ? : "<invalid>");
seq_printf(f, " master key: ");
for (i = 0; i < s->master_key_len; i++)
seq_printf(f, "%02x", s->master_key[i]);
seq_printf(f, "\n");
seq_printf(f, " master salt: ");
for (i = 0; i < sizeof(s->master_salt); i++)
seq_printf(f, "%02x", s->master_salt[i]);
seq_printf(f, "\n");
seq_printf(f, " session key: ");
for (i = 0; i < s->session_key_len; i++)
seq_printf(f, "%02x", c->session_key[i]);
seq_printf(f, "\n");
seq_printf(f, " session salt: ");
for (i = 0; i < sizeof(c->session_salt); i++)
seq_printf(f, "%02x", c->session_salt[i]);
seq_printf(f, "\n");
seq_printf(f, " session auth: ");
for (i = 0; i < sizeof(c->session_auth_key); i++)
seq_printf(f, "%02x", c->session_auth_key[i]);
seq_printf(f, "\n");
seq_printf(f, " ROC: %u\n", (unsigned int) c->roc);
if (s->mki_len) if (s->mki_len)
seq_printf(f, " MKI: length %u, %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x...\n", seq_printf(f, " MKI: length %u, %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x...\n",
s->mki_len, s->mki_len,
@ -1527,6 +1556,10 @@ static int proc_list_show(struct seq_file *f, void *v) {
g->target.payload_types[i], g->target.payload_types[i],
(unsigned long long) atomic64_read(&g->rtp_stats[i].bytes), (unsigned long long) atomic64_read(&g->rtp_stats[i].bytes),
(unsigned long long) atomic64_read(&g->rtp_stats[i].packets)); (unsigned long long) atomic64_read(&g->rtp_stats[i].packets));
if (g->target.ssrc)
seq_printf(f, " SSRC in: %08x\n", g->target.ssrc);
if (g->target.ssrc_out)
seq_printf(f, " SSRC out: %08x\n", g->target.ssrc_out);
proc_list_crypto_print(f, &g->decrypt, &g->target.decrypt, "decryption (incoming)"); proc_list_crypto_print(f, &g->decrypt, &g->target.decrypt, "decryption (incoming)");
proc_list_crypto_print(f, &g->encrypt, &g->target.encrypt, "encryption (outgoing)"); proc_list_crypto_print(f, &g->encrypt, &g->target.encrypt, "encryption (outgoing)");
if (g->target.rtcp_mux) if (g->target.rtcp_mux)
@ -4037,14 +4070,14 @@ intercept_done:
no_intercept: no_intercept:
if (rtp.ok) { if (rtp.ok) {
// SSRC substitution
if (g->target.transcoding && g->target.ssrc_out)
rtp.header->ssrc = g->target.ssrc_out;
pkt_idx = packet_index(&g->encrypt, &g->target.encrypt, rtp.header); pkt_idx = packet_index(&g->encrypt, &g->target.encrypt, rtp.header);
srtp_encrypt(&g->encrypt, &g->target.encrypt, &rtp, pkt_idx); srtp_encrypt(&g->encrypt, &g->target.encrypt, &rtp, pkt_idx);
skb_put(skb, g->target.encrypt.mki_len + g->target.encrypt.auth_tag_len); skb_put(skb, g->target.encrypt.mki_len + g->target.encrypt.auth_tag_len);
srtp_authenticate(&g->encrypt, &g->target.encrypt, &rtp, pkt_idx); srtp_authenticate(&g->encrypt, &g->target.encrypt, &rtp, pkt_idx);
// SSRC substitution
if (g->target.transcoding && g->target.ssrc_out)
rtp.header->ssrc = g->target.ssrc_out;
} }
err = send_proxy_packet(skb, &g->target.src_addr, &g->target.dst_addr, g->target.tos, par); err = send_proxy_packet(skb, &g->target.src_addr, &g->target.dst_addr, g->target.tos, par);


Loading…
Cancel
Save