|
|
|
@ -63,7 +63,7 @@ static void call_ng_flags_list(ng_parser_ctx_t *, bencode_item_t *list, |
|
|
|
void (*item_callback)(ng_parser_ctx_t *, bencode_item_t *, helper_arg), |
|
|
|
helper_arg); |
|
|
|
static void call_ng_flags_esc_str_list(ng_parser_ctx_t *out, str *s, helper_arg); |
|
|
|
static void ng_stats_ssrc(bencode_item_t *dict, struct ssrc_hash *ht); |
|
|
|
static void ng_stats_ssrc(const ng_parser_t *parser, bencode_item_t *dict, struct ssrc_hash *ht); |
|
|
|
static str *str_dup_escape(const str *s); |
|
|
|
static void call_set_dtmf_block(call_t *call, struct call_monologue *monologue, sdp_ng_flags *flags); |
|
|
|
|
|
|
|
@ -2394,8 +2394,8 @@ static void ng_stats_stream(const ng_parser_t *parser, bencode_item_t *list, con |
|
|
|
&STR(sockaddr_print_buf(&ps->selected_sfd->socket.local.address))); |
|
|
|
parser->dict_add_string(dict, "family", ps->selected_sfd->socket.local.address.family->name); |
|
|
|
} |
|
|
|
ng_stats_endpoint(parser, bencode_dictionary_add_dictionary(dict, "endpoint"), &ps->endpoint); |
|
|
|
ng_stats_endpoint(parser, bencode_dictionary_add_dictionary(dict, "advertised endpoint"), |
|
|
|
ng_stats_endpoint(parser, parser->dict_add_dict(dict, "endpoint"), &ps->endpoint); |
|
|
|
ng_stats_endpoint(parser, parser->dict_add_dict(dict, "advertised endpoint"), |
|
|
|
&ps->advertised_endpoint); |
|
|
|
if (ps->crypto.params.crypto_suite) |
|
|
|
parser->dict_add_string(dict, "crypto suite", |
|
|
|
@ -2429,8 +2429,8 @@ stats: |
|
|
|
s = &totals->totals[0]; |
|
|
|
if (!PS_ISSET(ps, RTP)) |
|
|
|
s = &totals->totals[1]; |
|
|
|
ng_stats(bencode_dictionary_add_dictionary(dict, "stats"), ps->stats_in, s); |
|
|
|
ng_stats(bencode_dictionary_add_dictionary(dict, "stats_out"), ps->stats_out, NULL); |
|
|
|
ng_stats(parser->dict_add_dict(dict, "stats"), ps->stats_in, s); |
|
|
|
ng_stats(parser->dict_add_dict(dict, "stats_out"), ps->stats_out, NULL); |
|
|
|
} |
|
|
|
|
|
|
|
#define BF_M(k, f) if (MEDIA_ISSET(m, f)) bencode_list_add_string(flags, k) |
|
|
|
@ -2512,11 +2512,11 @@ static void ng_stats_monologue(const ng_parser_t *parser, bencode_item_t *dict, |
|
|
|
goto stats; |
|
|
|
|
|
|
|
if (ml->tag.len) |
|
|
|
sub = bencode_dictionary_add_dictionary(dict, ml->tag.s); |
|
|
|
sub = parser->dict_add_dict(dict, ml->tag.s); |
|
|
|
else { |
|
|
|
char *buf = bencode_buffer_alloc(dict->buffer, 32); |
|
|
|
snprintf(buf, 32, "<untagged %u>", ml->unique_id); |
|
|
|
sub = bencode_dictionary_add_dictionary(dict, buf); |
|
|
|
sub = parser->dict_add_dict(dict, buf); |
|
|
|
} |
|
|
|
|
|
|
|
parser->dict_add_str(sub, "tag", &ml->tag); |
|
|
|
@ -2560,7 +2560,7 @@ static void ng_stats_monologue(const ng_parser_t *parser, bencode_item_t *dict, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ng_stats_ssrc(ssrc, ml->ssrc_hash); |
|
|
|
ng_stats_ssrc(parser, ssrc, ml->ssrc_hash); |
|
|
|
|
|
|
|
medias = bencode_dictionary_add_list(sub, "medias"); |
|
|
|
|
|
|
|
@ -2578,7 +2578,7 @@ static void ng_stats_monologue(const ng_parser_t *parser, bencode_item_t *dict, |
|
|
|
} |
|
|
|
|
|
|
|
if (ml->call->recording) { |
|
|
|
bencode_item_t *rec = bencode_dictionary_add_dictionary(sub, "recording"); |
|
|
|
bencode_item_t *rec = parser->dict_add_dict(sub, "recording"); |
|
|
|
bencode_dictionary_add_integer(rec, "excluded", !!ML_ISSET(ml, NO_RECORDING)); |
|
|
|
bencode_dictionary_add_integer(rec, "forwarding", !!ML_ISSET(ml, REC_FORWARDING)); |
|
|
|
} |
|
|
|
@ -2605,19 +2605,22 @@ static void ng_stats_ssrc_mos_entry(bencode_item_t *subent, struct ssrc_stats_bl |
|
|
|
ng_stats_ssrc_mos_entry_common(subent, sb, 1); |
|
|
|
bencode_dictionary_add_integer(subent, "reported at", sb->reported.tv_sec); |
|
|
|
} |
|
|
|
static void ng_stats_ssrc_mos_entry_dict(bencode_item_t *ent, const char *label, struct ssrc_stats_block *sb) { |
|
|
|
bencode_item_t *subent = bencode_dictionary_add_dictionary(ent, label); |
|
|
|
static void ng_stats_ssrc_mos_entry_dict(const ng_parser_t *parser, bencode_item_t *ent, const char *label, |
|
|
|
struct ssrc_stats_block *sb) |
|
|
|
{ |
|
|
|
bencode_item_t *subent = parser->dict_add_dict(ent, label); |
|
|
|
ng_stats_ssrc_mos_entry(subent, sb); |
|
|
|
} |
|
|
|
static void ng_stats_ssrc_mos_entry_dict_avg(bencode_item_t *ent, const char *label, struct ssrc_stats_block *sb, |
|
|
|
static void ng_stats_ssrc_mos_entry_dict_avg(const ng_parser_t *parser, bencode_item_t *ent, const char *label, |
|
|
|
struct ssrc_stats_block *sb, |
|
|
|
unsigned int div) |
|
|
|
{ |
|
|
|
bencode_item_t *subent = bencode_dictionary_add_dictionary(ent, label); |
|
|
|
bencode_item_t *subent = parser->dict_add_dict(ent, label); |
|
|
|
ng_stats_ssrc_mos_entry_common(subent, sb, div); |
|
|
|
bencode_dictionary_add_integer(subent, "samples", div); |
|
|
|
} |
|
|
|
|
|
|
|
static void ng_stats_ssrc(bencode_item_t *dict, struct ssrc_hash *ht) { |
|
|
|
static void ng_stats_ssrc(const ng_parser_t *parser, bencode_item_t *dict, struct ssrc_hash *ht) { |
|
|
|
GList *ll = g_hash_table_get_values(ht->ht); |
|
|
|
|
|
|
|
for (GList *l = ll; l; l = l->next) { |
|
|
|
@ -2629,17 +2632,17 @@ static void ng_stats_ssrc(bencode_item_t *dict, struct ssrc_hash *ht) { |
|
|
|
if (!se->stats_blocks.length || !se->lowest_mos || !se->highest_mos) |
|
|
|
continue; |
|
|
|
|
|
|
|
bencode_item_t *ent = bencode_dictionary_add_dictionary(dict, tmp); |
|
|
|
bencode_item_t *ent = parser->dict_add_dict(dict, tmp); |
|
|
|
|
|
|
|
bencode_dictionary_add_integer(ent, "cumulative loss", se->packets_lost); |
|
|
|
|
|
|
|
int mos_samples = se->stats_blocks.length - se->no_mos_count; |
|
|
|
if (mos_samples < 1) mos_samples = 1; |
|
|
|
ng_stats_ssrc_mos_entry_dict_avg(ent, "average MOS", &se->average_mos, mos_samples); |
|
|
|
ng_stats_ssrc_mos_entry_dict(ent, "lowest MOS", se->lowest_mos); |
|
|
|
ng_stats_ssrc_mos_entry_dict(ent, "highest MOS", se->highest_mos); |
|
|
|
ng_stats_ssrc_mos_entry_dict_avg(parser, ent, "average MOS", &se->average_mos, mos_samples); |
|
|
|
ng_stats_ssrc_mos_entry_dict(parser, ent, "lowest MOS", se->lowest_mos); |
|
|
|
ng_stats_ssrc_mos_entry_dict(parser, ent, "highest MOS", se->highest_mos); |
|
|
|
|
|
|
|
bencode_item_t *progdict = bencode_dictionary_add_dictionary(ent, "MOS progression"); |
|
|
|
bencode_item_t *progdict = parser->dict_add_dict(ent, "MOS progression"); |
|
|
|
// aim for about 10 entries to the list |
|
|
|
GList *listent = se->stats_blocks.head; |
|
|
|
struct ssrc_stats_block *sb = listent->data; |
|
|
|
@ -2688,8 +2691,8 @@ void ng_call_stats(ng_parser_ctx_t *ctx, call_t *call, const str *fromtag, const |
|
|
|
bencode_dictionary_add_integer(ctx->resp, "last signal", call->last_signal); |
|
|
|
bencode_dictionary_add_integer(ctx->resp, "last redis update", atomic64_get_na(&call->last_redis_update)); |
|
|
|
|
|
|
|
ssrc = bencode_dictionary_add_dictionary(ctx->resp, "SSRC"); |
|
|
|
tags = bencode_dictionary_add_dictionary(ctx->resp, "tags"); |
|
|
|
ssrc = ctx->parser->dict_add_dict(ctx->resp, "SSRC"); |
|
|
|
tags = ctx->parser->dict_add_dict(ctx->resp, "tags"); |
|
|
|
|
|
|
|
stats: |
|
|
|
match_tag = (totag && totag->s && totag->len) ? totag : fromtag; |
|
|
|
@ -2728,12 +2731,12 @@ stats: |
|
|
|
if (!ctx) |
|
|
|
return; |
|
|
|
|
|
|
|
dict = bencode_dictionary_add_dictionary(ctx->resp, "totals"); |
|
|
|
ng_stats(bencode_dictionary_add_dictionary(dict, "RTP"), &totals->totals[0], NULL); |
|
|
|
ng_stats(bencode_dictionary_add_dictionary(dict, "RTCP"), &totals->totals[1], NULL); |
|
|
|
dict = ctx->parser->dict_add_dict(ctx->resp, "totals"); |
|
|
|
ng_stats(ctx->parser->dict_add_dict(dict, "RTP"), &totals->totals[0], NULL); |
|
|
|
ng_stats(ctx->parser->dict_add_dict(dict, "RTCP"), &totals->totals[1], NULL); |
|
|
|
|
|
|
|
if (call->recording) { |
|
|
|
bencode_item_t *rec = bencode_dictionary_add_dictionary(ctx->resp, "recording"); |
|
|
|
bencode_item_t *rec = ctx->parser->dict_add_dict(ctx->resp, "recording"); |
|
|
|
bencode_dictionary_add_integer(rec, "call recording", !!CALL_ISSET(call, RECORDING_ON)); |
|
|
|
bencode_dictionary_add_integer(rec, "forwarding", !!CALL_ISSET(call, REC_FORWARDING)); |
|
|
|
} |
|
|
|
@ -3750,7 +3753,7 @@ const char *call_subscribe_request_ng(ng_parser_ctx_t *ctx) { |
|
|
|
bencode_item_t *tag_medias = NULL, *media_labels = NULL; |
|
|
|
if (flags.siprec) { |
|
|
|
tag_medias = bencode_dictionary_add_list(output, "tag-medias"); |
|
|
|
media_labels = bencode_dictionary_add_dictionary(output, "media-labels"); |
|
|
|
media_labels = ctx->parser->dict_add_dict(output, "media-labels"); |
|
|
|
} |
|
|
|
bencode_item_t *from_list = bencode_dictionary_add_list(output, "from-tags"); |
|
|
|
for (__auto_type l = srms.head; l; l = l->next) { |
|
|
|
@ -3775,7 +3778,7 @@ const char *call_subscribe_request_ng(ng_parser_ctx_t *ctx) { |
|
|
|
|
|
|
|
if (media_labels) { |
|
|
|
bencode_item_t *label = |
|
|
|
bencode_dictionary_add_dictionary(media_labels, media->label.s); |
|
|
|
ctx->parser->dict_add_dict(media_labels, media->label.s); |
|
|
|
ctx->parser->dict_add_str(label, "tag", &source_ml->tag); |
|
|
|
bencode_dictionary_add_integer(label, "index", media->index); |
|
|
|
ctx->parser->dict_add_str(label, "type", &media->type); |
|
|
|
|