|
|
|
@ -1818,17 +1818,10 @@ static struct re_dest_addr *find_dest_addr(const struct re_dest_addr_hash *h, co |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int table_get_target_stats(struct rtpengine_table *t, const struct re_address *local, |
|
|
|
struct rtpengine_stats_info *i, int reset) |
|
|
|
{ |
|
|
|
struct rtpengine_target *g; |
|
|
|
static void target_retrieve_stats(struct rtpengine_target *g, struct rtpengine_stats_info *i, int reset) { |
|
|
|
unsigned int u; |
|
|
|
unsigned long flags; |
|
|
|
|
|
|
|
g = get_target(t, local); |
|
|
|
if (!g) |
|
|
|
return -ENOENT; |
|
|
|
|
|
|
|
spin_lock_irqsave(&g->ssrc_stats_lock, flags); |
|
|
|
|
|
|
|
for (u = 0; u < RTPE_NUM_SSRC_TRACKING; u++) { |
|
|
|
@ -1843,6 +1836,21 @@ static int table_get_target_stats(struct rtpengine_table *t, const struct re_add |
|
|
|
} |
|
|
|
|
|
|
|
spin_unlock_irqrestore(&g->ssrc_stats_lock, flags); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// retrieve and return the current stats for a target |
|
|
|
static int table_get_target_stats(struct rtpengine_table *t, const struct re_address *local, |
|
|
|
struct rtpengine_stats_info *i, int reset) |
|
|
|
{ |
|
|
|
struct rtpengine_target *g; |
|
|
|
|
|
|
|
g = get_target(t, local); |
|
|
|
if (!g) |
|
|
|
return -ENOENT; |
|
|
|
|
|
|
|
target_retrieve_stats(g, i, reset); |
|
|
|
|
|
|
|
target_put(g); |
|
|
|
|
|
|
|
@ -1851,7 +1859,8 @@ static int table_get_target_stats(struct rtpengine_table *t, const struct re_add |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int table_del_target(struct rtpengine_table *t, const struct re_address *local) { |
|
|
|
// removes a target from the table and returns it |
|
|
|
static struct rtpengine_target *table_steal_target(struct rtpengine_table *t, const struct re_address *local) { |
|
|
|
unsigned char hi, lo; |
|
|
|
struct re_dest_addr *rda; |
|
|
|
struct re_bucket *b; |
|
|
|
@ -1859,7 +1868,7 @@ static int table_del_target(struct rtpengine_table *t, const struct re_address * |
|
|
|
unsigned long flags; |
|
|
|
|
|
|
|
if (!local || !is_valid_address(local)) |
|
|
|
return -EINVAL; |
|
|
|
return ERR_PTR(-EINVAL); |
|
|
|
|
|
|
|
hi = (local->port & 0xff00) >> 8; |
|
|
|
lo = local->port & 0xff; |
|
|
|
@ -1892,10 +1901,22 @@ out: |
|
|
|
write_unlock_irqrestore(&t->target_lock, flags); |
|
|
|
|
|
|
|
if (!g) |
|
|
|
return -ENOENT; |
|
|
|
return ERR_PTR(-ENOENT); |
|
|
|
if (b) |
|
|
|
kfree(b); |
|
|
|
|
|
|
|
return g; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// removes target from table and releases the reference to free it |
|
|
|
static int table_del_target(struct rtpengine_table *t, const struct re_address *local) { |
|
|
|
struct rtpengine_target *g = table_steal_target(t, local); |
|
|
|
|
|
|
|
if (IS_ERR(g)) |
|
|
|
return PTR_ERR(g); |
|
|
|
|
|
|
|
target_put(g); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|