diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 20b8be9cc..674a1fdae 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1349,8 +1349,10 @@ static int __k_srtp_crypt(struct rtpengine_srtp *s, struct crypto_context *c, .rtp_auth_tag_len= c->params.crypto_suite->srtp_auth_tag, .rtcp_auth_tag_len= c->params.crypto_suite->srtcp_auth_tag, }; - for (unsigned int i = 0; i < RTPE_NUM_SSRC_TRACKING; i++) + for (unsigned int i = 0; i < RTPE_NUM_SSRC_TRACKING; i++) { s->last_rtp_index[i] = ssrc_ctx[i] ? ssrc_ctx[i]->srtp_index : 0; + s->last_rtcp_index[i] = ssrc_ctx[i] ? ssrc_ctx[i]->srtcp_index : 0; + } if (c->params.mki_len) memcpy(s->mki, c->params.mki, c->params.mki_len); memcpy(s->master_key, c->params.master_key, c->params.crypto_suite->master_key_len); @@ -1796,6 +1798,27 @@ static void __stream_consume_stats(struct packet_stream *ps, const struct rtpeng mutex_unlock(&sink->out_lock); } + + for (GList *l = ps->rtcp_sinks.head; l; l = l->next) { + struct sink_handler *sh = l->data; + struct packet_stream *sink = sh->sink; + + if (mutex_trylock(&sink->out_lock)) + continue; // will have to skip this + + ssrc_ctx = __hunt_ssrc_ctx(ssrc, sink->ssrc_out, u); + if (!ssrc_ctx) + ssrc_ctx = __hunt_ssrc_ctx(ssrc_map_out, sink->ssrc_out, u); + + if (ssrc_ctx) { + if (sh->kernel_output_idx >= 0) { + ssrc_ctx->srtcp_index + = stats_info->last_rtcp_index[sh->kernel_output_idx][u]; + } + } + + mutex_unlock(&sink->out_lock); + } } } @@ -3501,6 +3524,10 @@ enum thread_looper_action kernel_stats_updater(void) { ctx->srtp_index = o->encrypt.last_rtp_index[u]; update = true; } + if (ctx->srtcp_index != o->encrypt.last_rtcp_index[u]) { + ctx->srtcp_index = o->encrypt.last_rtcp_index[u]; + update = true; + } } mutex_unlock(&sink->out_lock); } diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index f6b16a734..1b8f092c3 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -1667,10 +1667,11 @@ static void proc_list_crypto_print(struct seq_file *f, struct re_crypto_context seq_printf(f, " ROC:"); for (i = 0; i < ARRAY_SIZE(c->roc); i++) { - seq_printf(f, "%s %u (%lu)", + seq_printf(f, "%s %u (%lu/%lu)", (i == 0) ? "" : ",", (unsigned int) c->roc[i], - (unsigned long) s->last_rtp_index[i]); + (unsigned long) s->last_rtp_index[i], + (unsigned long) s->last_rtcp_index[i]); } seq_printf(f, "\n"); @@ -1883,7 +1884,7 @@ static struct re_dest_addr *find_dest_addr(const struct re_dest_addr_hash *h, co static void target_retrieve_stats(struct rtpengine_target *g, struct rtpengine_stats_info *i, int reset) { - unsigned int u; + unsigned int u, v; unsigned long flags; spin_lock_irqsave(&g->ssrc_stats_lock, flags); @@ -1899,6 +1900,11 @@ static void target_retrieve_stats(struct rtpengine_target *g, struct rtpengine_s } } + for (u = 0; u < g->target.num_destinations; u++) { + for (v = 0; v < RTPE_NUM_SSRC_TRACKING; v++) + i->last_rtcp_index[u][v] = g->outputs[u].output.encrypt.last_rtcp_index[v]; + } + spin_unlock_irqrestore(&g->ssrc_stats_lock, flags); } diff --git a/kernel-module/xt_RTPENGINE.h b/kernel-module/xt_RTPENGINE.h index 04f4299d3..fde130479 100644 --- a/kernel-module/xt_RTPENGINE.h +++ b/kernel-module/xt_RTPENGINE.h @@ -178,6 +178,7 @@ struct rtpengine_packet_info { struct rtpengine_stats_info { uint32_t ssrc[RTPE_NUM_SSRC_TRACKING]; struct rtpengine_ssrc_stats ssrc_stats[RTPE_NUM_SSRC_TRACKING]; + uint64_t last_rtcp_index[RTPE_MAX_FORWARD_DESTINATIONS][RTPE_NUM_SSRC_TRACKING]; }; enum rtpengine_command {