|
|
|
@ -1270,12 +1270,12 @@ static ssize_t proc_blist_read(struct file *f, char __user *b, size_t l, loff_t
|
|
|
|
|
struct inode *inode;
|
|
|
|
|
u_int32_t id;
|
|
|
|
|
struct rtpengine_table *t;
|
|
|
|
|
struct rtpengine_list_entry op;
|
|
|
|
|
struct rtpengine_list_entry *opp;
|
|
|
|
|
int err, port, addr_bucket, i;
|
|
|
|
|
struct rtpengine_target *g;
|
|
|
|
|
unsigned long flags;
|
|
|
|
|
|
|
|
|
|
if (l != sizeof(op))
|
|
|
|
|
if (l != sizeof(*opp))
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
if (*o < 0)
|
|
|
|
|
return -EINVAL;
|
|
|
|
@ -1294,39 +1294,43 @@ static ssize_t proc_blist_read(struct file *f, char __user *b, size_t l, loff_t
|
|
|
|
|
if (!g)
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
memset(&op, 0, sizeof(op));
|
|
|
|
|
memcpy(&op.target, &g->target, sizeof(op.target));
|
|
|
|
|
opp = kzalloc(sizeof(*opp), GFP_KERNEL);
|
|
|
|
|
|
|
|
|
|
op.stats.packets = atomic64_read(&g->stats.packets);
|
|
|
|
|
op.stats.bytes = atomic64_read(&g->stats.bytes);
|
|
|
|
|
op.stats.errors = atomic64_read(&g->stats.errors);
|
|
|
|
|
op.stats.delay_min = g->stats.delay_min;
|
|
|
|
|
op.stats.delay_max = g->stats.delay_max;
|
|
|
|
|
op.stats.delay_avg = g->stats.delay_avg;
|
|
|
|
|
op.stats.in_tos = atomic_read(&g->stats.in_tos);
|
|
|
|
|
memcpy(&opp->target, &g->target, sizeof(opp->target));
|
|
|
|
|
|
|
|
|
|
opp->stats.packets = atomic64_read(&g->stats.packets);
|
|
|
|
|
opp->stats.bytes = atomic64_read(&g->stats.bytes);
|
|
|
|
|
opp->stats.errors = atomic64_read(&g->stats.errors);
|
|
|
|
|
opp->stats.delay_min = g->stats.delay_min;
|
|
|
|
|
opp->stats.delay_max = g->stats.delay_max;
|
|
|
|
|
opp->stats.delay_avg = g->stats.delay_avg;
|
|
|
|
|
opp->stats.in_tos = atomic_read(&g->stats.in_tos);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < g->target.num_payload_types; i++) {
|
|
|
|
|
op.rtp_stats[i].packets = atomic64_read(&g->rtp_stats[i].packets);
|
|
|
|
|
op.rtp_stats[i].bytes = atomic64_read(&g->rtp_stats[i].bytes);
|
|
|
|
|
opp->rtp_stats[i].packets = atomic64_read(&g->rtp_stats[i].packets);
|
|
|
|
|
opp->rtp_stats[i].bytes = atomic64_read(&g->rtp_stats[i].bytes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
spin_lock_irqsave(&g->decrypt.lock, flags);
|
|
|
|
|
op.target.decrypt.last_index = g->target.decrypt.last_index;
|
|
|
|
|
opp->target.decrypt.last_index = g->target.decrypt.last_index;
|
|
|
|
|
spin_unlock_irqrestore(&g->decrypt.lock, flags);
|
|
|
|
|
|
|
|
|
|
spin_lock_irqsave(&g->encrypt.lock, flags);
|
|
|
|
|
op.target.encrypt.last_index = g->target.encrypt.last_index;
|
|
|
|
|
opp->target.encrypt.last_index = g->target.encrypt.last_index;
|
|
|
|
|
spin_unlock_irqrestore(&g->encrypt.lock, flags);
|
|
|
|
|
|
|
|
|
|
target_put(g);
|
|
|
|
|
|
|
|
|
|
err = -EFAULT;
|
|
|
|
|
if (copy_to_user(b, &op, sizeof(op)))
|
|
|
|
|
goto err;
|
|
|
|
|
if (copy_to_user(b, opp, sizeof(*opp)))
|
|
|
|
|
goto err2;
|
|
|
|
|
|
|
|
|
|
table_put(t);
|
|
|
|
|
kfree(opp);
|
|
|
|
|
return l;
|
|
|
|
|
|
|
|
|
|
err2:
|
|
|
|
|
kfree(opp);
|
|
|
|
|
err:
|
|
|
|
|
table_put(t);
|
|
|
|
|
return err;
|
|
|
|
|