From f97ff25ae5ebbc15bd78136654d6131de59e811f Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Tue, 3 Dec 2024 04:03:32 +0100 Subject: [PATCH] MT#61574 DSM: re-use previous SDP if new given empty Re-use previously offered SDP body, when processing a call session with an involvement of DSM, and getting newer SIP invite having no SDP offer. This affects applications using the B2B `connectCollee()` functionality and doesn't actually touch the B2B core itself. (Which would be wrong if changed in a usual core SDP processing, whereas original request can be empty and an offer/answer is postponed to 200OK/ACK exchange) (Re)invites towards DSM applications technically must not be empty, because DSMs don't support late offering. In order to overcome that just pretend that empty re-INVITEs are using previous body version. Change-Id: I252eb9f32e7dc073454a2258b176f77bf15d35c9 --- apps/dsm/DSMCall.cpp | 12 ++++++++++-- core/AmB2BSession.cpp | 16 ++++++++++++++++ core/AmB2BSession.h | 1 + 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/apps/dsm/DSMCall.cpp b/apps/dsm/DSMCall.cpp index 1b7730af..f7d2151b 100644 --- a/apps/dsm/DSMCall.cpp +++ b/apps/dsm/DSMCall.cpp @@ -98,11 +98,19 @@ void DSMCall::onStart() void DSMCall::onInvite(const AmSipRequest& req) { // make B2B dialogs work in onInvite as well + + /* save SDP body to re-use if newer request has no SDP */ + AmMimeBody previous_body(invite_req.body); invite_req = req; + if (invite_req.body.empty() && !previous_body.empty()) { + invite_req.body = previous_body; + DBG("Currently processed INVITE has no SDP body, use the one from previous offer.\n"); + } + if (!process_invite) { // re-INVITEs - AmB2BCallerSession::onInvite(req); + AmB2BCallerSession::onInviteKeepSDP(req); return; } process_invite = false; @@ -126,7 +134,7 @@ void DSMCall::onInvite(const AmSipRequest& req) { } if (run_session_invite) - AmB2BCallerSession::onInvite(req); + AmB2BCallerSession::onInviteKeepSDP(req); } void DSMCall::onInvite2xx(const AmSipReply& reply) { diff --git a/core/AmB2BSession.cpp b/core/AmB2BSession.cpp index 1f1e1ec3..b991fdc2 100644 --- a/core/AmB2BSession.cpp +++ b/core/AmB2BSession.cpp @@ -1419,6 +1419,22 @@ void AmB2BCallerSession::onInvite(const AmSipRequest& req) AmB2BSession::onInvite(req); } +void AmB2BCallerSession::onInviteKeepSDP(const AmSipRequest& req) +{ + /* save SDP body to re-use if newer request has no SDP */ + AmMimeBody previous_body(invite_req.body); + invite_req = req; + + if (invite_req.body.empty() && !previous_body.empty()) { + invite_req.body = previous_body; + DBG("Currently processed INVITE has no SDP body, use the one from previous offer.\n"); + } + + est_invite_cseq = req.cseq; + + AmB2BSession::onInvite(req); +} + void AmB2BCallerSession::onInvite2xx(const AmSipReply& reply) { invite_req.cseq = reply.cseq; diff --git a/core/AmB2BSession.h b/core/AmB2BSession.h index 22a53a06..c68d91bc 100644 --- a/core/AmB2BSession.h +++ b/core/AmB2BSession.h @@ -434,6 +434,7 @@ class AmB2BCallerSession: public AmB2BSession // @see AmSession void onInvite(const AmSipRequest& req); + void onInviteKeepSDP(const AmSipRequest& req); /* keeps previous SDP if given INVITE has empty SDP */ void onInvite2xx(const AmSipReply& reply); void onCancel(const AmSipRequest& req); void onBye(const AmSipRequest& req);