From 320b293dd5cf778f468579b2d699c97b6aaf136e Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 1 Apr 2026 09:53:40 -0400 Subject: [PATCH] MT#55283 add "create" method Change-Id: I626996028a6c5a9ee296efdeba8f301411b74ec7 --- daemon/call.c | 126 ++++++++++++- daemon/call_interfaces.c | 82 +++++++++ daemon/codec.c | 8 + daemon/control_ng.c | 17 +- daemon/sdp.c | 1 + include/call.h | 4 + include/call_interfaces.h | 3 + include/codec.h | 2 + include/control_ng.h | 2 + t/test-stats.c | 364 +++++++++++++++++++++++++++++++++++++- 10 files changed, 598 insertions(+), 11 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 279e96365..fdb4e8c79 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -1618,7 +1618,8 @@ static void __generate_crypto(const sdp_ng_flags *flags, struct call_media *this /* preferred crypto suites for the offerer - generated answer */ const str_q *offered_order = &flags->sdes_offerer_pref; - bool is_offer = (flags->opmode == OP_OFFER || flags->opmode == OP_SUBSCRIBE_REQ); + bool is_offer = (flags->opmode == OP_OFFER || flags->opmode == OP_SUBSCRIBE_REQ + || flags->opmode == OP_CREATE); if (!this->protocol || !this->protocol->srtp || MEDIA_ISSET(this, PASSTHRU)) { crypto_params_sdes_queue_clear(cpq); @@ -6435,3 +6436,126 @@ bool monologue_transform(struct call_monologue *ml, sdp_ng_flags *flags, medias_ return true; } + +__attribute__((nonnull(1, 2, 3))) +static bool monologue_call_create_media(struct call_monologue *ml, sdp_ng_flags *flags, + const str *type, unsigned int idx, const str_q *codecs) +{ + __auto_type m = call_get_media(ml, type, codec_get_type(type), NULL, false, idx, str_ht_null()); + if (!m) + return false; + + m->protocol = flags->transport_protocol ?: &transport_protocols[PROTO_RTP_AVP]; + bf_set(&m->media_flags, MEDIA_FLAG_SEND | MEDIA_FLAG_RECV + | MEDIA_FLAG_SETUP_ACTIVE | MEDIA_FLAG_SETUP_PASSIVE + | MEDIA_FLAG_DTLS | MEDIA_FLAG_SDES); + + __rtcp_mux_set(flags, m); + media_init_from_flags(m, flags); + media_set_audio_player(m, flags); + media_gen_media_id(m, flags); + if (flags->ice_option == ICE_FORCE) + MEDIA_SET(m, ICE); + if (flags->trickle_ice) + MEDIA_SET(m, TRICKLE_ICE); + if (flags->ice_lite_option == ICE_LITE_FWD) + MEDIA_SET(m, ICE_LITE_SELF); + + m->desired_family = flags->address_family; + + if (!codecs || !codecs->length) + codecs = &flags->codec_offer; + + codec_store_create(&m->codecs, codecs); + codec_store_strip(&m->codecs, &flags->codec_strip, flags->codec_except); + + if (m->type_id == MT_AUDIO) + codec_store_synthesise_basic(&m->codecs, "create media"); + + __generate_crypto(flags, m, NULL); + + int num_ports = (flags->rtcp_mux_require || !m->protocol->rtp) ? 1 : 2; + __init_interface(m, &flags->interface, num_ports); + MEDIA_SET(m, INITIALIZED); + + if (!__get_endpoint_map(m, num_ports, NULL, NULL, true)) + return false; + __num_media_streams(m, num_ports); + + if (!__init_streams(m, NULL, flags)) + return false; + __ice_init(m); + + monologue_open_ports(ml); + monologue_media_start(ml); + + return true; +} + +bool monologue_call_create(struct call_monologue *ml, sdp_ng_flags *flags) { + if (!flags->medias.length) // default: one audio media + return monologue_call_create_media(ml, flags, STR_PTR("audio"), 1, NULL); + + unsigned int idx = 1; + + for (auto_iter(l, flags->medias.head); l; l = l->next) { + __auto_type m = l->data; + bool ok = monologue_call_create_media(ml, flags, &m->type, idx++, &m->codec_list); + if (!ok) + return false; + } + + return true; +} + + +bool monologue_call_create_answer(struct call_monologue *ml, sdp_ng_flags *flags, sdp_streams_q *streams) { + g_auto(str_ht) mid_tracker = str_ht_new(); + + for (__auto_type l = streams->head; l; l = l->next) + { + struct stream_params *sp = l->data; + struct call_media *media = __get_media(ml, sp, flags, 0, mid_tracker); + + if (!media) + continue; + + media_init_from_flags(media, flags); + media_set_audio_player(media, flags); + media_update_protocol(media, sp); + media_answer_media_id(media, sp); + media_loop_protect(sp, media); + media_update_flags(media, sp); + media_update_crypto(media, sp, flags); + media_update_format(media, sp); + media_set_ptime(media, sp, flags->ptime, 0); + media_update_extmap(media, sp, NULL, flags); + + codec_store_populate(&media->codecs, &sp->codecs, + .codec_set = flags->codec_set, + .allow_asymmetric = !!flags->allow_asymmetric_codecs); + codec_store_strip(&media->codecs, &flags->codec_strip, flags->codec_except); + codec_store_offer(&media->codecs, &flags->codec_offer, &sp->codecs); + + __dtls_logic(flags, media, sp); + + if (!__init_streams(media, sp, flags)) + return -1; + + bf_copy(&media->media_flags, MEDIA_FLAG_RECV, &sp->sp_flags, SP_FLAG_SEND); + bf_copy(&media->media_flags, MEDIA_FLAG_SEND, &sp->sp_flags, SP_FLAG_RECV); + + MEDIA_SET(media, INITIALIZED); + + codec_update_media_source_handlers(media, .flags = flags); + codec_update_media_handlers(media); + + update_init_subscribers(media, sp, flags, flags->opmode); + + __media_unconfirm(media, "create answer event"); + + sdp_sp_move(&media->sp, sp); + } + + return true; +} diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 0fc7b7f4b..137237de4 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -1695,6 +1695,16 @@ static void call_ng_codec(const ng_parser_t *parser, str *key, parser_arg value, } static void call_ng_codec_iter(const ng_parser_t *parser, parser_arg item, struct ng_media *media) { + // we support two types here: + // the "transform" method supplies an extended list of codecs, as a list of dicts + // the "create" method uses a list of strings, similar to codec->offer + if (!parser->is_dict(item)) { + str s; + parser->get_str(item, &s); + call_ng_flags_esc_str_list(&s, 0, &media->codec_list); + return; + } + __auto_type codec = g_new0(struct ng_codec, 1); t_queue_push_tail(&media->codecs, codec); @@ -2494,6 +2504,7 @@ static void ng_codecs_free(struct ng_codec *c) { static void ng_media_free(struct ng_media *m) { t_queue_clear_full(&m->codecs, ng_codecs_free); + t_queue_clear_full(&m->codec_list, str_free); g_free(m); } @@ -4587,6 +4598,77 @@ const char *call_transform_ng(ng_command_ctx_t *ctx) { return NULL; } +const char *call_create_ng(ng_command_ctx_t *ctx) { + g_auto(sdp_ng_flags) flags; + g_autoptr(call_t) call = NULL; + char rand_call_id[65]; + char rand_from_tag[65]; + g_auto(str) sdp = STR_NULL; + + call_ng_process_flags(&flags, ctx); + + if (!flags.call_id.len) + flags.call_id = STR_LEN(rand_hex_str(rand_call_id, 32), 64); + if (!flags.from_tag.len) + flags.from_tag = STR_LEN(rand_hex_str(rand_from_tag, 32), 64); + + call = call_get_or_create(&flags.call_id, false); + struct call_monologue *ml = call_get_or_create_monologue(call, &flags.from_tag); + if (!monologue_call_create(ml, &flags)) + return "failed to set up call/monologue"; + + if (!sdp_create(&sdp, ml, &flags)) + return "failed to create SDP"; + + const ng_parser_t *parser = ctx->parser_ctx.parser; + parser->dict_add_str_dup(ctx->resp, "call-id", &call->callid); + parser->dict_add_str_dup(ctx->resp, "from-tag", &ml->tag); + + ctx->ngbuf->sdp_out = sdp.s; + parser->dict_add_str_dup(ctx->resp, "sdp", &sdp); + sdp = STR_NULL; // ownership passed to output + + call_unlock_release_update(&call); + return NULL; +} + + +const char *call_create_answer_ng(ng_command_ctx_t *ctx) { + g_auto(sdp_ng_flags) flags; + g_autoptr(call_t) call = NULL; + g_auto(sdp_sessions_q) parsed = TYPED_GQUEUE_INIT; + g_auto(sdp_streams_q) streams = TYPED_GQUEUE_INIT; + + call_ng_process_flags(&flags, ctx); + + enum basic_errors ret; + if ((ret = call_ng_basic_checks(&flags)) > 0) + return _ng_basic_errors[ret]; + + call = call_get(&flags.call_id); + if (!call) + return "unknown call-ID"; + + if (!sdp_parse(&flags.sdp, &parsed, &flags)) + return "Failed to parse SDP"; + + if (!sdp_streams(&parsed, &streams, &flags)) + return "Incomplete SDP specification"; + + if (trickle_ice_update(ctx->ngbuf, call, &flags, &streams)) + return NULL; + + struct call_monologue *ml = call_get_monologue(call, &flags.from_tag); + if (!ml) + return "from-tag not found"; + + if (!monologue_call_create_answer(ml, &flags, &streams)) + return "failed to perform answer"; + + call_unlock_release_update(&call); + return NULL; +} + void call_interfaces_free(void) { if (info_re) { diff --git a/daemon/codec.c b/daemon/codec.c index f0a2d7f24..e233cee69 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -6186,6 +6186,14 @@ void codec_store_transcode(struct codec_store *cs, const str_q *offer, struct co #endif } +static rtp_payload_type *codec_make_payload_type_any(const str *codec_str, struct call_media *media) { + return codec_make_payload_type(codec_str, media->type_id); +} + +void codec_store_create(struct codec_store *cs, const str_q *offer) { + codec_store_add_q(cs, offer, NULL, codec_make_payload_type_any); +} + void __codec_store_answer(struct codec_store *dst, struct codec_store *src, sdp_ng_flags *flags, struct codec_store_args a) { diff --git a/daemon/control_ng.c b/daemon/control_ng.c index 9b6220deb..eb466d852 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -48,7 +48,8 @@ const char *ng_command_strings[OP_COUNT] = { "publish", "subscribe request", "subscribe answer", "unsubscribe", "inject start", "inject stop", - "connect", "cli", "transform" + "connect", "cli", "transform", + "create", "create answer", }; const char *ng_command_strings_esc[OP_COUNT] = { "ping", "offer", "answer", "delete", "query", "list", @@ -60,7 +61,8 @@ const char *ng_command_strings_esc[OP_COUNT] = { "publish", "subscribe_request", "subscribe_answer", "unsubscribe", "inject_start", "inject_stop", - "connect", "cli", "transform" + "connect", "cli", "transform", + "create", "create_answer", }; const char *ng_command_strings_short[OP_COUNT] = { "Ping", "Offer", "Answer", "Delete", "Query", "List", @@ -71,7 +73,8 @@ const char *ng_command_strings_short[OP_COUNT] = { "BlkSlnMedia", "UnblkSlnMedia", "Pub", "SubReq", "SubAns", "Unsub", "InjStart", "InjStop", - "Conn", "CLI", "Trnsfm" + "Conn", "CLI", "Trnsfm", + "Create", "CrtAnsw", }; typedef struct ng_ctx { @@ -868,6 +871,14 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons command_ctx.opmode = OP_TRANSFORM; errstr = call_transform_ng(&command_ctx); break; + case CSH_LOOKUP("create"): + command_ctx.opmode = OP_CREATE; + errstr = call_create_ng(&command_ctx); + break; + case CSH_LOOKUP("create answer"): + command_ctx.opmode = OP_CREATE_ANSWER; + errstr = call_create_answer_ng(&command_ctx); + break; default: errstr = "Unrecognized command"; } diff --git a/daemon/sdp.c b/daemon/sdp.c index 1a39779ae..625f2501a 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -2837,6 +2837,7 @@ static struct packet_stream *print_rtcp(GString *s, struct call_media *media, pa if (MEDIA_ISSET(media, RTCP_MUX) && (flags->opmode == OP_ANSWER || flags->opmode == OP_PUBLISH || + flags->opmode == OP_CREATE || ((flags->opmode == OP_OFFER || flags->opmode == OP_SUBSCRIBE_REQ) && flags->rtcp_mux_require) || IS_OP_OTHER(flags->opmode))) { diff --git a/include/call.h b/include/call.h index 844224ce6..77cd09338 100644 --- a/include/call.h +++ b/include/call.h @@ -907,6 +907,10 @@ int monologue_inject_stop(struct call_monologue *src, struct call_monologue *dst void dialogue_connect(struct call_monologue *, struct call_monologue *, sdp_ng_flags *); __attribute__((nonnull(1, 2, 3))) bool monologue_transform(struct call_monologue *, sdp_ng_flags *, medias_q *); +__attribute__((nonnull(1, 2))) +bool monologue_call_create(struct call_monologue *, sdp_ng_flags *); +__attribute__((nonnull(1, 2))) +bool monologue_call_create_answer(struct call_monologue *, sdp_ng_flags *, sdp_streams_q *streams); void monologue_destroy(struct call_monologue *ml); int call_delete_branch_by_id(const str *callid, const str *branch, const str *fromtag, const str *totag, ng_command_ctx_t *, int64_t delete_delay); diff --git a/include/call_interfaces.h b/include/call_interfaces.h index d3f7aee4f..22d502e9f 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -22,6 +22,7 @@ struct ng_media { str id; str type; ng_codecs_q codecs; + str_q codec_list; str destination_address; endpoint_t destination; @@ -357,6 +358,8 @@ const char *call_inject_start_ng(ng_command_ctx_t *); const char *call_inject_stop_ng(ng_command_ctx_t *); const char *call_connect_ng(ng_command_ctx_t *); const char *call_transform_ng(ng_command_ctx_t *); +const char *call_create_ng(ng_command_ctx_t *); +const char *call_create_answer_ng(ng_command_ctx_t *); void add_media_to_sub_list(subscription_q *q, struct call_media *media, struct call_monologue *ml); diff --git a/include/codec.h b/include/codec.h index e79f85677..fdb200221 100644 --- a/include/codec.h +++ b/include/codec.h @@ -196,6 +196,8 @@ __attribute__((nonnull(1, 2))) void codec_store_track(struct codec_store *, const str_q *); __attribute__((nonnull(1, 2, 3))) void codec_store_transcode(struct codec_store *, const str_q *, struct codec_store *); +__attribute__((nonnull(1, 2))) +void codec_store_create(struct codec_store *, const str_q *); __attribute__((nonnull(1, 2, 3))) void __codec_store_answer(struct codec_store *dst, struct codec_store *src, sdp_ng_flags *flags, struct codec_store_args); diff --git a/include/control_ng.h b/include/control_ng.h index 182f9b2b8..90db3c057 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -34,6 +34,8 @@ enum ng_opmode { OP_CONNECT, OP_CLI, OP_TRANSFORM, + OP_CREATE, + OP_CREATE_ANSWER, OP_COUNT, // last, number of elements OP_OTHER = OP_COUNT // alias to above diff --git a/t/test-stats.c b/t/test-stats.c index 26fd7d8d7..21f85a523 100644 --- a/t/test-stats.c +++ b/t/test-stats.c @@ -315,6 +315,20 @@ int main(void) { "transforms_ps_max 0 150\n" "transforms_ps_avg 0 150\n" "transform_count 0 150\n" + "create_time_min 0.000000 150\n" + "create_time_max 0.000000 150\n" + "create_time_avg 0.000000 150\n" + "creates_ps_min 0 150\n" + "creates_ps_max 0 150\n" + "creates_ps_avg 0 150\n" + "create_count 0 150\n" + "create_answer_time_min 0.000000 150\n" + "create_answer_time_max 0.000000 150\n" + "create_answer_time_avg 0.000000 150\n" + "create_answers_ps_min 0 150\n" + "create_answers_ps_max 0 150\n" + "create_answers_ps_avg 0 150\n" + "create_answer_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -821,6 +835,22 @@ int main(void) { "0.000000\n" "avgtransformdelay\n" "0.000000\n" + "Min/Max/Avg create processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreatedelay\n" + "0.000000\n" + "maxcreatedelay\n" + "0.000000\n" + "avgcreatedelay\n" + "0.000000\n" + "Min/Max/Avg create answer processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreate answerdelay\n" + "0.000000\n" + "maxcreate answerdelay\n" + "0.000000\n" + "avgcreate answerdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -1077,6 +1107,22 @@ int main(void) { "0\n" "avgtransformrequestrate\n" "0\n" + "Min/Max/Avg create requests per second\n" + "0/0/0 per sec\n" + "mincreaterequestrate\n" + "0\n" + "maxcreaterequestrate\n" + "0\n" + "avgcreaterequestrate\n" + "0\n" + "Min/Max/Avg create answer requests per second\n" + "0/0/0 per sec\n" + "mincreate answerrequestrate\n" + "0\n" + "maxcreate answerrequestrate\n" + "0\n" + "avgcreate answerrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -1240,7 +1286,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm | Create | CrtAnsw \n" "\n" "]\n" "totalpingcount\n" @@ -1307,6 +1353,10 @@ int main(void) { "0\n" "totaltrnsfmcount\n" "0\n" + "totalcreatecount\n" + "0\n" + "totalcrtanswcount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -1552,6 +1602,20 @@ int main(void) { "transforms_ps_max 0 150\n" "transforms_ps_avg 0 150\n" "transform_count 0 150\n" + "create_time_min 0.000000 150\n" + "create_time_max 0.000000 150\n" + "create_time_avg 0.000000 150\n" + "creates_ps_min 0 150\n" + "creates_ps_max 0 150\n" + "creates_ps_avg 0 150\n" + "create_count 0 150\n" + "create_answer_time_min 0.000000 150\n" + "create_answer_time_max 0.000000 150\n" + "create_answer_time_avg 0.000000 150\n" + "create_answers_ps_min 0 150\n" + "create_answers_ps_max 0 150\n" + "create_answers_ps_avg 0 150\n" + "create_answer_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -2058,6 +2122,22 @@ int main(void) { "0.000000\n" "avgtransformdelay\n" "0.000000\n" + "Min/Max/Avg create processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreatedelay\n" + "0.000000\n" + "maxcreatedelay\n" + "0.000000\n" + "avgcreatedelay\n" + "0.000000\n" + "Min/Max/Avg create answer processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreate answerdelay\n" + "0.000000\n" + "maxcreate answerdelay\n" + "0.000000\n" + "avgcreate answerdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -2314,6 +2394,22 @@ int main(void) { "0\n" "avgtransformrequestrate\n" "0\n" + "Min/Max/Avg create requests per second\n" + "0/0/0 per sec\n" + "mincreaterequestrate\n" + "0\n" + "maxcreaterequestrate\n" + "0\n" + "avgcreaterequestrate\n" + "0\n" + "Min/Max/Avg create answer requests per second\n" + "0/0/0 per sec\n" + "mincreate answerrequestrate\n" + "0\n" + "maxcreate answerrequestrate\n" + "0\n" + "avgcreate answerrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -2477,7 +2573,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm | Create | CrtAnsw \n" "\n" "]\n" "totalpingcount\n" @@ -2544,6 +2640,10 @@ int main(void) { "0\n" "totaltrnsfmcount\n" "0\n" + "totalcreatecount\n" + "0\n" + "totalcrtanswcount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -2786,6 +2886,20 @@ int main(void) { "transforms_ps_max 0 150\n" "transforms_ps_avg 0 150\n" "transform_count 0 150\n" + "create_time_min 0.000000 150\n" + "create_time_max 0.000000 150\n" + "create_time_avg 0.000000 150\n" + "creates_ps_min 0 150\n" + "creates_ps_max 0 150\n" + "creates_ps_avg 0 150\n" + "create_count 0 150\n" + "create_answer_time_min 0.000000 150\n" + "create_answer_time_max 0.000000 150\n" + "create_answer_time_avg 0.000000 150\n" + "create_answers_ps_min 0 150\n" + "create_answers_ps_max 0 150\n" + "create_answers_ps_avg 0 150\n" + "create_answer_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -3292,6 +3406,22 @@ int main(void) { "0.000000\n" "avgtransformdelay\n" "0.000000\n" + "Min/Max/Avg create processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreatedelay\n" + "0.000000\n" + "maxcreatedelay\n" + "0.000000\n" + "avgcreatedelay\n" + "0.000000\n" + "Min/Max/Avg create answer processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreate answerdelay\n" + "0.000000\n" + "maxcreate answerdelay\n" + "0.000000\n" + "avgcreate answerdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -3548,6 +3678,22 @@ int main(void) { "0\n" "avgtransformrequestrate\n" "0\n" + "Min/Max/Avg create requests per second\n" + "0/0/0 per sec\n" + "mincreaterequestrate\n" + "0\n" + "maxcreaterequestrate\n" + "0\n" + "avgcreaterequestrate\n" + "0\n" + "Min/Max/Avg create answer requests per second\n" + "0/0/0 per sec\n" + "mincreate answerrequestrate\n" + "0\n" + "maxcreate answerrequestrate\n" + "0\n" + "avgcreate answerrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -3711,7 +3857,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm | Create | CrtAnsw \n" "\n" "]\n" "totalpingcount\n" @@ -3778,6 +3924,10 @@ int main(void) { "0\n" "totaltrnsfmcount\n" "0\n" + "totalcreatecount\n" + "0\n" + "totalcrtanswcount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -4039,6 +4189,20 @@ int main(void) { "transforms_ps_max 0 157\n" "transforms_ps_avg 0 157\n" "transform_count 0 157\n" + "create_time_min 0.000000 157\n" + "create_time_max 0.000000 157\n" + "create_time_avg 0.000000 157\n" + "creates_ps_min 0 157\n" + "creates_ps_max 0 157\n" + "creates_ps_avg 0 157\n" + "create_count 0 157\n" + "create_answer_time_min 0.000000 157\n" + "create_answer_time_max 0.000000 157\n" + "create_answer_time_avg 0.000000 157\n" + "create_answers_ps_min 0 157\n" + "create_answers_ps_max 0 157\n" + "create_answers_ps_avg 0 157\n" + "create_answer_count 0 157\n" "call_dur 0.000000 157\n" "average_call_dur 0.000000 157\n" "forced_term_sess 0 157\n" @@ -4545,6 +4709,22 @@ int main(void) { "0.000000\n" "avgtransformdelay\n" "0.000000\n" + "Min/Max/Avg create processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreatedelay\n" + "0.000000\n" + "maxcreatedelay\n" + "0.000000\n" + "avgcreatedelay\n" + "0.000000\n" + "Min/Max/Avg create answer processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreate answerdelay\n" + "0.000000\n" + "maxcreate answerdelay\n" + "0.000000\n" + "avgcreate answerdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -4801,6 +4981,22 @@ int main(void) { "0\n" "avgtransformrequestrate\n" "0\n" + "Min/Max/Avg create requests per second\n" + "0/0/0 per sec\n" + "mincreaterequestrate\n" + "0\n" + "maxcreaterequestrate\n" + "0\n" + "avgcreaterequestrate\n" + "0\n" + "Min/Max/Avg create answer requests per second\n" + "0/0/0 per sec\n" + "mincreate answerrequestrate\n" + "0\n" + "maxcreate answerrequestrate\n" + "0\n" + "avgcreate answerrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -4964,7 +5160,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm | Create | CrtAnsw \n" "\n" "]\n" "totalpingcount\n" @@ -5031,6 +5227,10 @@ int main(void) { "0\n" "totaltrnsfmcount\n" "0\n" + "totalcreatecount\n" + "0\n" + "totalcrtanswcount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -5281,6 +5481,20 @@ int main(void) { "transforms_ps_max 0 157\n" "transforms_ps_avg 0 157\n" "transform_count 0 157\n" + "create_time_min 0.000000 157\n" + "create_time_max 0.000000 157\n" + "create_time_avg 0.000000 157\n" + "creates_ps_min 0 157\n" + "creates_ps_max 0 157\n" + "creates_ps_avg 0 157\n" + "create_count 0 157\n" + "create_answer_time_min 0.000000 157\n" + "create_answer_time_max 0.000000 157\n" + "create_answer_time_avg 0.000000 157\n" + "create_answers_ps_min 0 157\n" + "create_answers_ps_max 0 157\n" + "create_answers_ps_avg 0 157\n" + "create_answer_count 0 157\n" "call_dur 0.000000 157\n" "average_call_dur 0.000000 157\n" "forced_term_sess 0 157\n" @@ -5787,6 +6001,22 @@ int main(void) { "0.000000\n" "avgtransformdelay\n" "0.000000\n" + "Min/Max/Avg create processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreatedelay\n" + "0.000000\n" + "maxcreatedelay\n" + "0.000000\n" + "avgcreatedelay\n" + "0.000000\n" + "Min/Max/Avg create answer processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreate answerdelay\n" + "0.000000\n" + "maxcreate answerdelay\n" + "0.000000\n" + "avgcreate answerdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -6043,6 +6273,22 @@ int main(void) { "0\n" "avgtransformrequestrate\n" "0\n" + "Min/Max/Avg create requests per second\n" + "0/0/0 per sec\n" + "mincreaterequestrate\n" + "0\n" + "maxcreaterequestrate\n" + "0\n" + "avgcreaterequestrate\n" + "0\n" + "Min/Max/Avg create answer requests per second\n" + "0/0/0 per sec\n" + "mincreate answerrequestrate\n" + "0\n" + "maxcreate answerrequestrate\n" + "0\n" + "avgcreate answerrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -6206,7 +6452,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm | Create | CrtAnsw \n" "\n" "]\n" "totalpingcount\n" @@ -6273,6 +6519,10 @@ int main(void) { "0\n" "totaltrnsfmcount\n" "0\n" + "totalcreatecount\n" + "0\n" + "totalcrtanswcount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -6517,6 +6767,20 @@ int main(void) { "transforms_ps_max 0 200\n" "transforms_ps_avg 0 200\n" "transform_count 0 200\n" + "create_time_min 0.000000 200\n" + "create_time_max 0.000000 200\n" + "create_time_avg 0.000000 200\n" + "creates_ps_min 0 200\n" + "creates_ps_max 0 200\n" + "creates_ps_avg 0 200\n" + "create_count 0 200\n" + "create_answer_time_min 0.000000 200\n" + "create_answer_time_max 0.000000 200\n" + "create_answer_time_avg 0.000000 200\n" + "create_answers_ps_min 0 200\n" + "create_answers_ps_max 0 200\n" + "create_answers_ps_avg 0 200\n" + "create_answer_count 0 200\n" "call_dur 143.000000 200\n" "average_call_dur 0.000000 200\n" "forced_term_sess 0 200\n" @@ -7023,6 +7287,22 @@ int main(void) { "0.000000\n" "avgtransformdelay\n" "0.000000\n" + "Min/Max/Avg create processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreatedelay\n" + "0.000000\n" + "maxcreatedelay\n" + "0.000000\n" + "avgcreatedelay\n" + "0.000000\n" + "Min/Max/Avg create answer processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreate answerdelay\n" + "0.000000\n" + "maxcreate answerdelay\n" + "0.000000\n" + "avgcreate answerdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -7279,6 +7559,22 @@ int main(void) { "0\n" "avgtransformrequestrate\n" "0\n" + "Min/Max/Avg create requests per second\n" + "0/0/0 per sec\n" + "mincreaterequestrate\n" + "0\n" + "maxcreaterequestrate\n" + "0\n" + "avgcreaterequestrate\n" + "0\n" + "Min/Max/Avg create answer requests per second\n" + "0/0/0 per sec\n" + "mincreate answerrequestrate\n" + "0\n" + "maxcreate answerrequestrate\n" + "0\n" + "avgcreate answerrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -7442,7 +7738,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm | Create | CrtAnsw \n" "\n" "]\n" "totalpingcount\n" @@ -7509,6 +7805,10 @@ int main(void) { "0\n" "totaltrnsfmcount\n" "0\n" + "totalcreatecount\n" + "0\n" + "totalcrtanswcount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -7756,6 +8056,20 @@ int main(void) { "transforms_ps_max 0 200\n" "transforms_ps_avg 0 200\n" "transform_count 0 200\n" + "create_time_min 0.000000 200\n" + "create_time_max 0.000000 200\n" + "create_time_avg 0.000000 200\n" + "creates_ps_min 0 200\n" + "creates_ps_max 0 200\n" + "creates_ps_avg 0 200\n" + "create_count 0 200\n" + "create_answer_time_min 0.000000 200\n" + "create_answer_time_max 0.000000 200\n" + "create_answer_time_avg 0.000000 200\n" + "create_answers_ps_min 0 200\n" + "create_answers_ps_max 0 200\n" + "create_answers_ps_avg 0 200\n" + "create_answer_count 0 200\n" "call_dur 0.000000 200\n" "average_call_dur 93.000000 200\n" "forced_term_sess 0 200\n" @@ -8262,6 +8576,22 @@ int main(void) { "0.000000\n" "avgtransformdelay\n" "0.000000\n" + "Min/Max/Avg create processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreatedelay\n" + "0.000000\n" + "maxcreatedelay\n" + "0.000000\n" + "avgcreatedelay\n" + "0.000000\n" + "Min/Max/Avg create answer processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "mincreate answerdelay\n" + "0.000000\n" + "maxcreate answerdelay\n" + "0.000000\n" + "avgcreate answerdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -8518,6 +8848,22 @@ int main(void) { "0\n" "avgtransformrequestrate\n" "0\n" + "Min/Max/Avg create requests per second\n" + "0/0/0 per sec\n" + "mincreaterequestrate\n" + "0\n" + "maxcreaterequestrate\n" + "0\n" + "avgcreaterequestrate\n" + "0\n" + "Min/Max/Avg create answer requests per second\n" + "0/0/0 per sec\n" + "mincreate answerrequestrate\n" + "0\n" + "maxcreate answerrequestrate\n" + "0\n" + "avgcreate answerrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -8681,7 +9027,7 @@ int main(void) { "{\n" "proxies\n" "[\n" - " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm \n" + " Proxy | Ping | Offer | Answer | Delete | Query | List | StartRec | StopRec | PauseRec | StartFwd | StopFwd | BlkDTMF | UnblkDTMF | BlkMedia | UnblkMedia | PlayMedia | StopMedia | PlayDTMF | Stats | SlnMedia | UnslnMedia | BlkSlnMedia | UnblkSlnMedia | Pub | SubReq | SubAns | Unsub | InjStart | InjStop | Conn | CLI | Trnsfm | Create | CrtAnsw \n" "\n" "]\n" "totalpingcount\n" @@ -8748,6 +9094,10 @@ int main(void) { "0\n" "totaltrnsfmcount\n" "0\n" + "totalcreatecount\n" + "0\n" + "totalcrtanswcount\n" + "0\n" "\n" "}\n" "interfaces\n"