|
|
|
@ -2409,6 +2409,7 @@ static int table_new_target(struct rtpengine_table *t, struct rtpengine_target_i
|
|
|
|
|
struct interface_stats_block *iface_stats;
|
|
|
|
|
struct stream_stats *stats;
|
|
|
|
|
struct rtp_stats *pt_stats[RTPE_NUM_PAYLOAD_TYPES];
|
|
|
|
|
struct ssrc_stats *ssrc_stats[RTPE_NUM_SSRC_TRACKING];
|
|
|
|
|
|
|
|
|
|
/* validation */
|
|
|
|
|
|
|
|
|
@ -2444,6 +2445,15 @@ static int table_new_target(struct rtpengine_table *t, struct rtpengine_target_i
|
|
|
|
|
if (!pt_stats[u])
|
|
|
|
|
return -EFAULT;
|
|
|
|
|
}
|
|
|
|
|
for (u = 0; u < RTPE_NUM_SSRC_TRACKING; u++) {
|
|
|
|
|
if (!i->ssrc[u])
|
|
|
|
|
break;
|
|
|
|
|
if (!i->ssrc_stats[u])
|
|
|
|
|
return -EFAULT;
|
|
|
|
|
ssrc_stats[u] = shm_map_resolve(i->ssrc_stats[u], sizeof(*ssrc_stats[u]));
|
|
|
|
|
if (!ssrc_stats[u])
|
|
|
|
|
return -EFAULT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DBG("Creating new target\n");
|
|
|
|
|
|
|
|
|
@ -2462,8 +2472,10 @@ static int table_new_target(struct rtpengine_table *t, struct rtpengine_target_i
|
|
|
|
|
crypto_context_init(&g->decrypt_rtp, &g->target.decrypt);
|
|
|
|
|
crypto_context_init(&g->decrypt_rtcp, &g->target.decrypt);
|
|
|
|
|
spin_lock_init(&g->ssrc_stats_lock);
|
|
|
|
|
for (u = 0; u < RTPE_NUM_SSRC_TRACKING; u++)
|
|
|
|
|
for (u = 0; u < RTPE_NUM_SSRC_TRACKING; u++) {
|
|
|
|
|
g->ssrc_stats[u].lost_bits = -1;
|
|
|
|
|
g->target.ssrc_stats[u] = ssrc_stats[u];
|
|
|
|
|
}
|
|
|
|
|
rwlock_init(&g->outputs_lock);
|
|
|
|
|
g->target.iface_stats = iface_stats;
|
|
|
|
|
g->target.stats = stats;
|
|
|
|
|