|
|
|
@ -1949,6 +1949,59 @@ str *call_delete_udp(char **out, struct callmaster *m) { |
|
|
|
return str_sprintf("%s 0\n", out[RE_UDP_COOKIE]); |
|
|
|
} |
|
|
|
|
|
|
|
#define SSUM(x) \ |
|
|
|
totals[0].x += p->rtps[0].stats.x; \ |
|
|
|
totals[1].x += p->rtps[1].stats.x; \ |
|
|
|
totals[2].x += px->rtps[0].stats.x; \ |
|
|
|
totals[3].x += px->rtps[1].stats.x |
|
|
|
/* call must be locked */ |
|
|
|
static void stats_query(struct call *call, str *fromtag, str *totag, struct stats *totals, |
|
|
|
void (*cb)(struct peer *, struct peer *, void *), void *arg) |
|
|
|
{ |
|
|
|
GList *l; |
|
|
|
struct callstream *cs; |
|
|
|
int i; |
|
|
|
struct peer *p, *px; |
|
|
|
|
|
|
|
ZERO(totals[0]); /* rtp in */ |
|
|
|
ZERO(totals[1]); /* rtcp in */ |
|
|
|
ZERO(totals[2]); /* rtp out */ |
|
|
|
ZERO(totals[3]); /* rtcp out */ |
|
|
|
|
|
|
|
for (l = call->callstreams->head; l; l = l->next) { |
|
|
|
cs = l->data; |
|
|
|
mutex_lock(&cs->lock); |
|
|
|
|
|
|
|
for (i = 0; i < 2; i++) { |
|
|
|
p = &cs->peers[i]; |
|
|
|
px = &cs->peers[i ^ 1]; |
|
|
|
|
|
|
|
if (!fromtag->len) |
|
|
|
goto tag_match; |
|
|
|
|
|
|
|
if (str_cmp_str(&p->tag, fromtag)) |
|
|
|
continue; |
|
|
|
if (!totag->len) |
|
|
|
goto tag_match; |
|
|
|
|
|
|
|
if (str_cmp_str(&px->tag, totag)) |
|
|
|
continue; |
|
|
|
|
|
|
|
tag_match: |
|
|
|
if (cb) |
|
|
|
cb(p, px, arg); |
|
|
|
|
|
|
|
SSUM(packets); |
|
|
|
SSUM(bytes); |
|
|
|
SSUM(errors); |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
mutex_unlock(&cs->lock); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
str *call_query_udp(char **out, struct callmaster *m) { |
|
|
|
struct call *c; |
|
|
|
str *ret, callid; |
|
|
|
@ -2390,20 +2443,19 @@ static bencode_item_t *peer_stats(bencode_buffer_t *b, struct peer *p) { |
|
|
|
return d; |
|
|
|
} |
|
|
|
|
|
|
|
#define SSUM(x) \ |
|
|
|
totals[0].x += p->rtps[0].stats.x; \ |
|
|
|
totals[1].x += p->rtps[1].stats.x; \ |
|
|
|
totals[2].x += px->rtps[0].stats.x; \ |
|
|
|
totals[3].x += px->rtps[1].stats.x |
|
|
|
static void ng_stats_cb(struct peer *p, struct peer *px, void *streams) { |
|
|
|
bencode_item_t *stream; |
|
|
|
|
|
|
|
stream = bencode_list_add_list(streams); |
|
|
|
bencode_list_add(stream, peer_stats(stream->buffer, p)); |
|
|
|
bencode_list_add(stream, peer_stats(stream->buffer, px)); |
|
|
|
} |
|
|
|
|
|
|
|
const char *call_query_ng(bencode_item_t *input, struct callmaster *m, bencode_item_t *output) { |
|
|
|
str callid, fromtag, totag; |
|
|
|
struct call *call; |
|
|
|
GList *l; |
|
|
|
struct callstream *cs; |
|
|
|
bencode_item_t *streams, *stream, *dict; |
|
|
|
struct peer *p, *px; |
|
|
|
struct stats totals[4]; /* rtp in, rtcp in, rtp out, rtcp out */ |
|
|
|
int i; |
|
|
|
bencode_item_t *streams, *dict; |
|
|
|
struct stats totals[4]; |
|
|
|
|
|
|
|
if (!bencode_dictionary_get_str(input, "call-id", &callid)) |
|
|
|
return "No call-id in message"; |
|
|
|
@ -2415,42 +2467,9 @@ const char *call_query_ng(bencode_item_t *input, struct callmaster *m, bencode_i |
|
|
|
|
|
|
|
bencode_dictionary_add_string(output, "result", "ok"); |
|
|
|
bencode_dictionary_add_integer(output, "created", call->created); |
|
|
|
streams = bencode_dictionary_add_list(output, "streams"); |
|
|
|
|
|
|
|
ZERO(totals); |
|
|
|
for (l = call->callstreams->head; l; l = l->next) { |
|
|
|
cs = l->data; |
|
|
|
mutex_lock(&cs->lock); |
|
|
|
|
|
|
|
for (i = 0; i < 2; i++) { |
|
|
|
p = &cs->peers[i]; |
|
|
|
px = &cs->peers[i ^ 1]; |
|
|
|
|
|
|
|
if (!fromtag.len) |
|
|
|
goto tag_match; |
|
|
|
|
|
|
|
if (str_cmp_str(&p->tag, &fromtag)) |
|
|
|
continue; |
|
|
|
if (!totag.len) |
|
|
|
goto tag_match; |
|
|
|
|
|
|
|
if (str_cmp_str(&px->tag, &totag)) |
|
|
|
continue; |
|
|
|
|
|
|
|
tag_match: |
|
|
|
stream = bencode_list_add_list(streams); |
|
|
|
bencode_list_add(stream, peer_stats(output->buffer, p)); |
|
|
|
bencode_list_add(stream, peer_stats(output->buffer, px)); |
|
|
|
|
|
|
|
SSUM(packets); |
|
|
|
SSUM(bytes); |
|
|
|
SSUM(errors); |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
mutex_unlock(&cs->lock); |
|
|
|
} |
|
|
|
streams = bencode_dictionary_add_list(output, "streams"); |
|
|
|
stats_query(call, &fromtag, &totag, totals, ng_stats_cb, streams); |
|
|
|
|
|
|
|
mutex_unlock(&call->lock); |
|
|
|
|
|
|
|
|