diff --git a/daemon/call.c b/daemon/call.c index b7e21658b..32faadcbc 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -6450,8 +6450,10 @@ static void monologue_stop(struct call_monologue *ml, bool stop_media_subscriber // call must be locked in W and will be unlocked upon returning __attribute__((nonnull(1))) -static int call_delete_full(call_t *c, const str *callid, ng_command_ctx_t *ctx, int64_t delete_delay) { - if (ctx) +static int call_delete_full(call_t *c, const str *callid, ng_command_ctx_t *ctx, int64_t delete_delay, + bool stats) +{ + if (ctx && stats) ng_call_stats(ctx, c, NULL, NULL, NULL); for (__auto_type i = c->monologues.head; i; i = i->next) { @@ -6484,7 +6486,8 @@ static int call_delete_full(call_t *c, const str *callid, ng_command_ctx_t *ctx, __attribute__((nonnull(1, 2))) static int call_delete_monologue(call_t *c, const str *callid, struct call_monologue *ml, const str *fromtag, const str *totag, - ng_command_ctx_t *ctx, int64_t delete_delay) + ng_command_ctx_t *ctx, int64_t delete_delay, + bool stats) { c->destroyed = rtpe_now; @@ -6503,9 +6506,9 @@ static int call_delete_monologue(call_t *c, const str *callid, struct call_monol del_stop = call_monologues_associations_left(c); if (!del_stop) - return call_delete_full(c, callid, ctx, delete_delay); + return call_delete_full(c, callid, ctx, delete_delay, stats); - if (ctx) + if (ctx && stats) ng_call_stats(ctx, c, fromtag, totag, NULL); rwlock_unlock_w(&c->master_lock); @@ -6520,7 +6523,8 @@ static int call_delete_monologue(call_t *c, const str *callid, struct call_monol // call must be locked in W. // unlocks the call and releases the reference prior to returning, even on error. int call_delete_branch(call_t *c, const str *callid, const str *branch, - const str *fromtag, const str *totag, ng_command_ctx_t *ctx, int64_t delete_delay) + const str *fromtag, const str *totag, ng_command_ctx_t *ctx, int64_t delete_delay, + bool stats) { struct call_monologue *ml; const str *match_tag; @@ -6537,26 +6541,26 @@ int call_delete_branch(call_t *c, const str *callid, const str *branch, } if (!fromtag || !fromtag->len) - return call_delete_full(c, callid, ctx, delete_delay); + return call_delete_full(c, callid, ctx, delete_delay, stats); if ((!totag || !totag->len) && branch && branch->len) { // try a via-branch match ml = t_hash_table_lookup(c->viabranches, branch); if (ml) - return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay); + return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay, stats); } match_tag = (totag && totag->len) ? totag : fromtag; ml = call_get_monologue(c, match_tag); if (ml) - return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay); + return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay, stats); if (branch && branch->len) { // also try a via-branch match here ml = t_hash_table_lookup(c->viabranches, branch); if (ml) - return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay); + return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay, stats); } /* IMPORTANT! @@ -6574,7 +6578,7 @@ int call_delete_branch(call_t *c, const str *callid, const str *branch, if (ml) { struct call_monologue *sub_ml = ml_medias_subscribed_to_single_ml(ml); if (sub_ml && !sub_ml->tag.len) - return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay); + return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay, stats); } } @@ -6596,7 +6600,7 @@ int call_delete_branch_by_id(const str *callid, const str *branch, ilog(LOG_INFO, "Call-ID to delete not found"); return -1; } - return call_delete_branch(c, callid, branch, fromtag, totag, ctx, delete_delay); + return call_delete_branch(c, callid, branch, fromtag, totag, ctx, delete_delay, false); } struct call_media *call_make_transform_media(struct call_monologue *ml, const str *type, enum media_type type_id, diff --git a/daemon/call_flags.c b/daemon/call_flags.c index a02669871..584e95baf 100644 --- a/daemon/call_flags.c +++ b/daemon/call_flags.c @@ -750,6 +750,9 @@ const char *call_ng_flags_flags(str *s, unsigned int idx, helper_arg arg) { case CSH_LOOKUP("fatal"): out->fatal = true; break; + case CSH_LOOKUP("fast"): + out->fast = true; + break; case CSH_LOOKUP("fragment"): out->fragment = true; break; diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index a178a3377..b4d55f26a 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -754,7 +754,8 @@ const char *call_delete_ng(ng_command_ctx_t *ctx) { if (call_delete_branch(c, &rtpp_flags.call_id, &rtpp_flags.via_branch, &rtpp_flags.from_tag, (rtpp_flags.to_tag_flag ? &rtpp_flags.to_tag : NULL), - ctx, rtpp_flags.delete_delay)) + ctx, rtpp_flags.delete_delay, + !rtpp_flags.fast)) { goto err; } diff --git a/docs/ng_control_protocol.md b/docs/ng_control_protocol.md index 1b39fbd7a..d7c2717b4 100644 --- a/docs/ng_control_protocol.md +++ b/docs/ng_control_protocol.md @@ -1851,6 +1851,12 @@ of zero or more strings. The following flags are defined: result in an error reply (i.e. `"result": "error"`). The default is to reply with a warning only (i.e. `"result": "ok", "warning": ...`). +* `fast` + + Omit adding statistics to the response message. This makes processing of + the delete message more light-weight and produces a smaller response + message, which is beneficial if the statistics aren't needed. + * `to-tag` This flag controls whether the `"To"` tag's value is honoured or ignored when handling diff --git a/include/call.h b/include/call.h index 96c9b2df8..49a74ed28 100644 --- a/include/call.h +++ b/include/call.h @@ -943,9 +943,11 @@ void monologue_destroy(struct call_monologue *ml); __attribute__((nonnull(1))) 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); + __attribute__((nonnull(1, 2))) int call_delete_branch(call_t *, const str *callid, const str *branch, - const str *fromtag, const str *totag, ng_command_ctx_t *, int64_t delete_delay); + const str *fromtag, const str *totag, ng_command_ctx_t *, int64_t delete_delay, + bool stats); void call_destroy(call_t *); struct call_media *call_media_new(call_t *call); diff --git a/include/call_flags.h b/include/call_flags.h index fd431ce6f..be9694bd8 100644 --- a/include/call_flags.h +++ b/include/call_flags.h @@ -313,6 +313,7 @@ RTPE_NG_FLAGS_STR_CASE_HT_PARAMS bidirectional:1, unsubscribe:1, fatal:1, + fast:1, new_branch:1, provisional:1, /* to_tag is used especially by delete handling */ diff --git a/utils/rtpengine-ng-client b/utils/rtpengine-ng-client index b9378965d..01e108f9a 100755 --- a/utils/rtpengine-ng-client +++ b/utils/rtpengine-ng-client @@ -60,6 +60,8 @@ my @flags = qw( mix unsubscribe strip-extmap + fatal + fast ); my @string_opts = qw(