From 3af3e799a8024ec8b31dc884ad67d0de153b1709 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 19 Dec 2024 15:17:28 -0400 Subject: [PATCH] MT#61368 add OP_CONNECT Change-Id: Ie07cb5bd139f5e039c5736009ae18733850b0c55 --- daemon/call_interfaces.c | 54 +++++++++++ daemon/control_ng.c | 7 ++ docs/ng_control_protocol.md | 18 ++++ include/call_interfaces.h | 2 + include/control_ng.h | 1 + t/test-stats.c | 189 ++++++++++++++++++++++++++++++++++-- utils/rtpengine-ng-client | 1 + 7 files changed, 265 insertions(+), 7 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 89854ec04..b2fa76dc4 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -1997,6 +1997,9 @@ void call_ng_main_flags(const ng_parser_t *parser, str *key, parser_arg value, h case CSH_LOOKUP("to-label"): out->to_label = s; break; + case CSH_LOOKUP("to-call-id"): + out->to_call_id = s; + break; case CSH_LOOKUP("to-tag"): out->to_tag = s; break; @@ -4007,6 +4010,57 @@ const char *call_unsubscribe_ng(ng_command_ctx_t *ctx) { } +const char *call_connect_ng(ng_command_ctx_t *ctx) { + g_auto(sdp_ng_flags) flags; + g_autoptr(call_t) call = NULL; + g_autoptr(call_t) call2 = NULL; + + call_ng_process_flags(&flags, ctx); + + if (!flags.call_id.s) + return "No call-id in message"; + if (!flags.from_tag.s) + return "No from-tag in message"; + if (!flags.to_tag.s) + return "No to-tag in message"; + + if (flags.to_call_id.s) { + call_get2_ret_t ret = call_get2(&call, &call2, &flags.call_id, &flags.to_call_id); + if (ret == CG2_NF1) + return "Unknown call-ID"; + if (ret == CG2_NF2) + return "Unknown to-tag call-ID"; + } + else { + call = call_get(&flags.call_id); + if (!call) + return "Unknown call-ID"; + } + + struct call_monologue *src_ml = call_get_or_create_monologue(call, &flags.from_tag); + if (!src_ml) + return "From-tag not found"; + + struct call_monologue *dest_ml = call_get_or_create_monologue(call2 ?: call, &flags.to_tag); + if (!dest_ml) + return "To-tag not found"; + + if (src_ml == dest_ml) + return "Trying to connect to self"; // XXX should this be allowed? + + if (call2) { + if (!call_merge(call, &call2)) + return "Failed to merge two calls into one"; + } + + dialogue_connect(src_ml, dest_ml, &flags); + + call_unlock_release_update(&call); + + return NULL; +} + + void call_interfaces_free(void) { if (info_re) { pcre2_code_free(info_re); diff --git a/daemon/control_ng.c b/daemon/control_ng.c index aced8a43d..058b46879 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -46,6 +46,7 @@ const char *ng_command_strings[OP_COUNT] = { "block silence media", "unblock silence media", "publish", "subscribe request", "subscribe answer", "unsubscribe", + "connect" }; const char *ng_command_strings_esc[OP_COUNT] = { "ping", "offer", "answer", "delete", "query", "list", @@ -56,6 +57,7 @@ const char *ng_command_strings_esc[OP_COUNT] = { "block_silence_media", "unblock_silence_media", "publish", "subscribe_request", "subscribe_answer", "unsubscribe", + "connect" }; const char *ng_command_strings_short[OP_COUNT] = { "Ping", "Offer", "Answer", "Delete", "Query", "List", @@ -65,6 +67,7 @@ const char *ng_command_strings_short[OP_COUNT] = { "PlayDTMF", "Stats", "SlnMedia", "UnslnMedia", "BlkSlnMedia", "UnblkSlnMedia", "Pub", "SubReq", "SubAns", "Unsub", + "Conn" }; typedef struct ng_ctx { @@ -841,6 +844,10 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons command_ctx.opmode = OP_UNSUBSCRIBE; errstr = call_unsubscribe_ng(&command_ctx); break; + case CSH_LOOKUP("connect"): + command_ctx.opmode = OP_CONNECT; + errstr = call_connect_ng(&command_ctx); + break; default: errstr = "Unrecognized command"; } diff --git a/docs/ng_control_protocol.md b/docs/ng_control_protocol.md index 94f632593..75f0fe06a 100644 --- a/docs/ng_control_protocol.md +++ b/docs/ng_control_protocol.md @@ -63,6 +63,7 @@ Currently the following commands are defined: * subscribe request * subscribe answer * unsubscribe +* connect The response dictionary must contain at least one key called `result`. The value can be either `ok` or `error`. @@ -2322,3 +2323,20 @@ forwarding will start to the endpoint given in the answer SDP. This message is a counterpart to `subsscribe answer` to stop an established subscription. The subscription to be stopped is identified by the `to-tag`. + +## `connect` Message + +This message makes it posible to directly connect the media of two call parties +without the need for a full offer/answer exchange. The required keys are +`call-id` to identify the call, and `from-tag and `to-tag` to identify the two +call parties to connect. The media will be connected in the same way as it +would through an offer/answer exchange. Transcoding will automaticaly be +engaged if needed. + +It's also possible to connect two call parties from two different calls +(different call IDs). To do so, the second call ID must be given as +`to-call-id`, with the given `to-tag` then being one of the call parties from +that second call. Internally, both calls will be merged into a single call +object, with both call IDs then corresponding to the same call. This will be +visible in certain statistics (e.g. two call IDs appearing in the list, but +only one call being counted). diff --git a/include/call_interfaces.h b/include/call_interfaces.h index 1e3c46218..51b359881 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -38,6 +38,7 @@ struct sdp_ng_flags { enum message_type message_type; unsigned int code; str call_id; + str to_call_id; str from_tag; str to_tag; str via_branch; @@ -303,6 +304,7 @@ const char *call_publish_ng(ng_command_ctx_t *, const char *, const char *call_subscribe_request_ng(ng_command_ctx_t *); const char *call_subscribe_answer_ng(ng_command_ctx_t *); const char *call_unsubscribe_ng(ng_command_ctx_t *); +const char *call_connect_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/control_ng.h b/include/control_ng.h index f2c487c0a..34bc45615 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -29,6 +29,7 @@ enum ng_opmode { OP_SUBSCRIBE_REQ, OP_SUBSCRIBE_ANS, OP_UNSUBSCRIBE, + OP_CONNECT, 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 97e0804c5..90acf28ce 100644 --- a/t/test-stats.c +++ b/t/test-stats.c @@ -276,6 +276,13 @@ int main(void) { "unsubscribes_ps_max 0 150\n" "unsubscribes_ps_avg 0 150\n" "unsubscribe_count 0 150\n" + "connect_time_min 0.000000 150\n" + "connect_time_max 0.000000 150\n" + "connect_time_avg 0.000000 150\n" + "connects_ps_min 0 150\n" + "connects_ps_max 0 150\n" + "connects_ps_avg 0 150\n" + "connect_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -734,6 +741,14 @@ int main(void) { "0.000000\n" "avgunsubscribedelay\n" "0.000000\n" + "Min/Max/Avg connect processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minconnectdelay\n" + "0.000000\n" + "maxconnectdelay\n" + "0.000000\n" + "avgconnectdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -950,6 +965,14 @@ int main(void) { "0\n" "avgunsubscriberequestrate\n" "0\n" + "Min/Max/Avg connect requests per second\n" + "0/0/0 per sec\n" + "minconnectrequestrate\n" + "0\n" + "maxconnectrequestrate\n" + "0\n" + "avgconnectrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -1113,7 +1136,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 \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 | Conn \n" "\n" "]\n" "totalpingcount\n" @@ -1170,6 +1193,8 @@ int main(void) { "0\n" "totalunsubcount\n" "0\n" + "totalconncount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -1379,6 +1404,13 @@ int main(void) { "unsubscribes_ps_max 0 150\n" "unsubscribes_ps_avg 0 150\n" "unsubscribe_count 0 150\n" + "connect_time_min 0.000000 150\n" + "connect_time_max 0.000000 150\n" + "connect_time_avg 0.000000 150\n" + "connects_ps_min 0 150\n" + "connects_ps_max 0 150\n" + "connects_ps_avg 0 150\n" + "connect_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -1837,6 +1869,14 @@ int main(void) { "0.000000\n" "avgunsubscribedelay\n" "0.000000\n" + "Min/Max/Avg connect processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minconnectdelay\n" + "0.000000\n" + "maxconnectdelay\n" + "0.000000\n" + "avgconnectdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -2053,6 +2093,14 @@ int main(void) { "0\n" "avgunsubscriberequestrate\n" "0\n" + "Min/Max/Avg connect requests per second\n" + "0/0/0 per sec\n" + "minconnectrequestrate\n" + "0\n" + "maxconnectrequestrate\n" + "0\n" + "avgconnectrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -2216,7 +2264,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 \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 | Conn \n" "\n" "]\n" "totalpingcount\n" @@ -2273,6 +2321,8 @@ int main(void) { "0\n" "totalunsubcount\n" "0\n" + "totalconncount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -2479,6 +2529,13 @@ int main(void) { "unsubscribes_ps_max 0 150\n" "unsubscribes_ps_avg 0 150\n" "unsubscribe_count 0 150\n" + "connect_time_min 0.000000 150\n" + "connect_time_max 0.000000 150\n" + "connect_time_avg 0.000000 150\n" + "connects_ps_min 0 150\n" + "connects_ps_max 0 150\n" + "connects_ps_avg 0 150\n" + "connect_count 0 150\n" "call_dur 0.000000 150\n" "average_call_dur 0.000000 150\n" "forced_term_sess 0 150\n" @@ -2937,6 +2994,14 @@ int main(void) { "0.000000\n" "avgunsubscribedelay\n" "0.000000\n" + "Min/Max/Avg connect processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minconnectdelay\n" + "0.000000\n" + "maxconnectdelay\n" + "0.000000\n" + "avgconnectdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -3153,6 +3218,14 @@ int main(void) { "0\n" "avgunsubscriberequestrate\n" "0\n" + "Min/Max/Avg connect requests per second\n" + "0/0/0 per sec\n" + "minconnectrequestrate\n" + "0\n" + "maxconnectrequestrate\n" + "0\n" + "avgconnectrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -3316,7 +3389,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 \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 | Conn \n" "\n" "]\n" "totalpingcount\n" @@ -3373,6 +3446,8 @@ int main(void) { "0\n" "totalunsubcount\n" "0\n" + "totalconncount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -3598,6 +3673,13 @@ int main(void) { "unsubscribes_ps_max 0 157\n" "unsubscribes_ps_avg 0 157\n" "unsubscribe_count 0 157\n" + "connect_time_min 0.000000 157\n" + "connect_time_max 0.000000 157\n" + "connect_time_avg 0.000000 157\n" + "connects_ps_min 0 157\n" + "connects_ps_max 0 157\n" + "connects_ps_avg 0 157\n" + "connect_count 0 157\n" "call_dur 0.000000 157\n" "average_call_dur 0.000000 157\n" "forced_term_sess 0 157\n" @@ -4056,6 +4138,14 @@ int main(void) { "0.000000\n" "avgunsubscribedelay\n" "0.000000\n" + "Min/Max/Avg connect processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minconnectdelay\n" + "0.000000\n" + "maxconnectdelay\n" + "0.000000\n" + "avgconnectdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -4272,6 +4362,14 @@ int main(void) { "0\n" "avgunsubscriberequestrate\n" "0\n" + "Min/Max/Avg connect requests per second\n" + "0/0/0 per sec\n" + "minconnectrequestrate\n" + "0\n" + "maxconnectrequestrate\n" + "0\n" + "avgconnectrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -4435,7 +4533,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 \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 | Conn \n" "\n" "]\n" "totalpingcount\n" @@ -4492,6 +4590,8 @@ int main(void) { "0\n" "totalunsubcount\n" "0\n" + "totalconncount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -4706,6 +4806,13 @@ int main(void) { "unsubscribes_ps_max 0 157\n" "unsubscribes_ps_avg 0 157\n" "unsubscribe_count 0 157\n" + "connect_time_min 0.000000 157\n" + "connect_time_max 0.000000 157\n" + "connect_time_avg 0.000000 157\n" + "connects_ps_min 0 157\n" + "connects_ps_max 0 157\n" + "connects_ps_avg 0 157\n" + "connect_count 0 157\n" "call_dur 0.000000 157\n" "average_call_dur 0.000000 157\n" "forced_term_sess 0 157\n" @@ -5164,6 +5271,14 @@ int main(void) { "0.000000\n" "avgunsubscribedelay\n" "0.000000\n" + "Min/Max/Avg connect processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minconnectdelay\n" + "0.000000\n" + "maxconnectdelay\n" + "0.000000\n" + "avgconnectdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -5380,6 +5495,14 @@ int main(void) { "0\n" "avgunsubscriberequestrate\n" "0\n" + "Min/Max/Avg connect requests per second\n" + "0/0/0 per sec\n" + "minconnectrequestrate\n" + "0\n" + "maxconnectrequestrate\n" + "0\n" + "avgconnectrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -5543,7 +5666,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 \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 | Conn \n" "\n" "]\n" "totalpingcount\n" @@ -5600,6 +5723,8 @@ int main(void) { "0\n" "totalunsubcount\n" "0\n" + "totalconncount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -5809,6 +5934,13 @@ int main(void) { "unsubscribes_ps_max 0 200\n" "unsubscribes_ps_avg 0 200\n" "unsubscribe_count 0 200\n" + "connect_time_min 0.000000 200\n" + "connect_time_max 0.000000 200\n" + "connect_time_avg 0.000000 200\n" + "connects_ps_min 0 200\n" + "connects_ps_max 0 200\n" + "connects_ps_avg 0 200\n" + "connect_count 0 200\n" "call_dur 143.000000 200\n" "average_call_dur 0.000000 200\n" "forced_term_sess 0 200\n" @@ -6267,6 +6399,14 @@ int main(void) { "0.000000\n" "avgunsubscribedelay\n" "0.000000\n" + "Min/Max/Avg connect processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minconnectdelay\n" + "0.000000\n" + "maxconnectdelay\n" + "0.000000\n" + "avgconnectdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -6483,6 +6623,14 @@ int main(void) { "0\n" "avgunsubscriberequestrate\n" "0\n" + "Min/Max/Avg connect requests per second\n" + "0/0/0 per sec\n" + "minconnectrequestrate\n" + "0\n" + "maxconnectrequestrate\n" + "0\n" + "avgconnectrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -6646,7 +6794,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 \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 | Conn \n" "\n" "]\n" "totalpingcount\n" @@ -6703,6 +6851,8 @@ int main(void) { "0\n" "totalunsubcount\n" "0\n" + "totalconncount\n" + "0\n" "\n" "}\n" "interfaces\n" @@ -6914,6 +7064,13 @@ int main(void) { "unsubscribes_ps_max 0 200\n" "unsubscribes_ps_avg 0 200\n" "unsubscribe_count 0 200\n" + "connect_time_min 0.000000 200\n" + "connect_time_max 0.000000 200\n" + "connect_time_avg 0.000000 200\n" + "connects_ps_min 0 200\n" + "connects_ps_max 0 200\n" + "connects_ps_avg 0 200\n" + "connect_count 0 200\n" "call_dur 0.000000 200\n" "average_call_dur 93.000000 200\n" "forced_term_sess 0 200\n" @@ -7372,6 +7529,14 @@ int main(void) { "0.000000\n" "avgunsubscribedelay\n" "0.000000\n" + "Min/Max/Avg connect processing delay\n" + "0.000000/0.000000/0.000000 sec\n" + "minconnectdelay\n" + "0.000000\n" + "maxconnectdelay\n" + "0.000000\n" + "avgconnectdelay\n" + "0.000000\n" "Min/Max/Avg ping requests per second\n" "0/0/0 per sec\n" "minpingrequestrate\n" @@ -7588,6 +7753,14 @@ int main(void) { "0\n" "avgunsubscriberequestrate\n" "0\n" + "Min/Max/Avg connect requests per second\n" + "0/0/0 per sec\n" + "minconnectrequestrate\n" + "0\n" + "maxconnectrequestrate\n" + "0\n" + "avgconnectrequestrate\n" + "0\n" "\n" "\n" "}\n" @@ -7751,7 +7924,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 \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 | Conn \n" "\n" "]\n" "totalpingcount\n" @@ -7808,6 +7981,8 @@ int main(void) { "0\n" "totalunsubcount\n" "0\n" + "totalconncount\n" + "0\n" "\n" "}\n" "interfaces\n" diff --git a/utils/rtpengine-ng-client b/utils/rtpengine-ng-client index 17367108a..360e2dd18 100755 --- a/utils/rtpengine-ng-client +++ b/utils/rtpengine-ng-client @@ -60,6 +60,7 @@ my @string_opts = qw( from-tag to-tag call-id + to-call-id transport-protocol media-address ICE