From ef817fccef2042eb6d3a64b24711f4416ffe42e5 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 23 Mar 2026 09:00:44 -0400 Subject: [PATCH] MT#55283 support individual unsubscribe action Change-Id: Id4ea984ce8109b6a962edb52d0e81532bbfbd701 --- daemon/call.c | 9 ++++++--- daemon/call_interfaces.c | 12 ++++++++++-- include/call.h | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 0c30c6617..2cfe6f1df 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -4610,8 +4610,7 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flag } /* called with call->master_lock held in W */ -__attribute__((nonnull(1, 2))) -int monologue_unsubscribe(struct call_monologue *dst_ml, sdp_ng_flags *flags) { +int monologue_unsubscribe(struct call_monologue *dst_ml, struct call_monologue *src_ml, sdp_ng_flags *flags) { for (unsigned int i = 0; i < dst_ml->medias->len; i++) { struct call_media *media = dst_ml->medias->pdata[i]; @@ -4622,6 +4621,9 @@ int monologue_unsubscribe(struct call_monologue *dst_ml, sdp_ng_flags *flags) { /* TODO: should we care about subscribers as well? */ IQUEUE_FOREACH_SAFE(&media->media_subscriptions, ms) { + if (src_ml && ms->monologue != src_ml) + continue; + struct call_media *src_media = ms->media; __media_unconfirm(src_media, "media unsubscribe"); @@ -4632,7 +4634,8 @@ int monologue_unsubscribe(struct call_monologue *dst_ml, sdp_ng_flags *flags) { update_init_subscribers(media, NULL, NULL, flags->opmode); } - monologue_destroy(dst_ml); + if (!src_ml) + monologue_destroy(dst_ml); return 0; } diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 137237de4..5ab55857b 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -4381,11 +4381,19 @@ const char *call_unsubscribe_ng(ng_command_ctx_t *ctx) { return "No to-tag in message"; // get destination monologue - struct call_monologue *dest_ml = call_get_or_create_monologue(call, &flags.to_tag); + struct call_monologue *dest_ml = call_get_monologue(call, &flags.to_tag); if (!dest_ml) return "To-tag not found"; - int ret = monologue_unsubscribe(dest_ml, &flags); + // get optional source monologue + struct call_monologue *src_ml = NULL; + if (flags.directional && flags.from_tag.len) { + src_ml = call_get_monologue(call, &flags.from_tag); + if (!src_ml) + return "From-tag not found"; + } + + int ret = monologue_unsubscribe(dest_ml, src_ml, &flags); if (ret) return "Failed to unsubscribe"; diff --git a/include/call.h b/include/call.h index 77cd09338..4ea0c7299 100644 --- a/include/call.h +++ b/include/call.h @@ -898,8 +898,8 @@ int monologue_subscribe_request(const subscription_q *srms, struct call_monologu __attribute__((nonnull(1, 2, 3))) int monologue_subscribe_answer(struct call_monologue *dst, sdp_ng_flags *flags, sdp_streams_q *streams); -__attribute__((nonnull(1, 2))) -int monologue_unsubscribe(struct call_monologue *dst, sdp_ng_flags *); +__attribute__((nonnull(1, 3))) +int monologue_unsubscribe(struct call_monologue *dst, struct call_monologue *src, sdp_ng_flags *); int monologue_inject_start(struct call_monologue *src, struct call_monologue *dst, sdp_ng_flags *flags); int monologue_inject_stop(struct call_monologue *src, struct call_monologue *dst,