diff --git a/daemon/media_socket.c b/daemon/media_socket.c index ddf996001..6f31ac132 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -3406,6 +3406,10 @@ enum thread_looper_action kernel_stats_updater(void) { for (unsigned int u = 0; u < G_N_ELEMENTS(ke->target.ssrc); u++) { if (!ke->target.ssrc[u]) // end of list break; + struct ssrc_ctx *in_ctx = __hunt_ssrc_ctx(ntohl(ke->target.ssrc[u]), + ps->ssrc_in, 0); + if (!in_ctx) + continue; uint32_t out_ssrc = o->ssrc_out[u]; if (!out_ssrc) out_ssrc = ke->target.ssrc[u]; @@ -3413,9 +3417,9 @@ enum thread_looper_action kernel_stats_updater(void) { sink->ssrc_out, 0); if (!ctx) continue; - if (rtpe_now.tv_sec - atomic64_get_na(&ps->stats_in->last_packet) < 2) + if (rtpe_now.tv_sec - atomic64_get_na(&in_ctx->stats->last_packet) < 2) payload_tracker_add(&ctx->tracker, - atomic_get_na(&ps->stats_in->last_pt)); + atomic_get_na(&in_ctx->stats->last_pt)); // XXX redis update } mutex_unlock(&sink->out_lock); @@ -3431,9 +3435,9 @@ enum thread_looper_action kernel_stats_updater(void) { if (!ctx) continue; - if (rtpe_now.tv_sec - atomic64_get_na(&ps->stats_in->last_packet) < 2) + if (rtpe_now.tv_sec - atomic64_get_na(&ctx->stats->last_packet) < 2) payload_tracker_add(&ctx->tracker, - atomic_get_na(&ps->stats_in->last_pt)); + atomic_get_na(&ctx->stats->last_pt)); // XXX redis update } diff --git a/kernel-module/common_stats.h b/kernel-module/common_stats.h index 584123f4c..6919d9974 100644 --- a/kernel-module/common_stats.h +++ b/kernel-module/common_stats.h @@ -47,7 +47,6 @@ struct stream_stats { atomic64 bytes; atomic64 errors; atomic64 last_packet; - atomic_t last_pt; atomic_t tos; }; @@ -69,6 +68,8 @@ struct ssrc_stats { atomic_t total_lost; atomic_t transit; atomic_t jitter; + atomic64 last_packet; + atomic_t last_pt; }; #endif diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index 35eb34b15..2dcce76ed 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -5429,8 +5429,11 @@ static unsigned int rtpengine46(struct sk_buff *skb, struct sk_buff *oskb, if (g->target.pt_filter) goto out; } - else - atomic_set(&g->target.stats->last_pt, g->target.pt_stats[rtp_pt_idx]->payload_type); + else if (ssrc_idx >= 0) { + atomic_set(&g->target.ssrc_stats[ssrc_idx]->last_pt, + g->target.pt_stats[rtp_pt_idx]->payload_type); + atomic64_set(&g->target.ssrc_stats[ssrc_idx]->last_packet, packet_ts); + } errstr = "SRTP decryption failed"; err = srtp_decrypt(&g->decrypt_rtp, &g->target.decrypt, &rtp, &pkt_idx);