MT#65357 OA: don't change state on empty 183

If 183 has empty body, don't change the state,
because otherwise it will break the OA model exchange
in later updates during the continued early dialog stage.

Keep pretending to remain in the `Completed` state.

Change-Id: I1053740a179c8589b54a0c856caa438a92521fda
master
Donat Zenichev 2 days ago
parent 618c15d95b
commit 68cd8dde3e

@ -349,8 +349,10 @@ int AmOfferAnswer::onRxSdp(unsigned int m_cseq, const string& m_remote_tag,
return err_code;
}
int AmOfferAnswer::onTxSdp(unsigned int m_cseq, bool is_reliable,
const AmMimeBody& body, bool force_no_sdp_update)
int AmOfferAnswer::onTxSdp(unsigned int m_cseq,
bool is_reliable,
const AmMimeBody& body,
bool force_no_sdp_update)
{
ILOG_DLG(L_DBG, "AmOfferAnswer::onTxSdp()\n");
@ -444,7 +446,7 @@ int AmOfferAnswer::onRequestOut(AmSipRequest& req)
}
if ((has_sdp || (has_csta && req.method != SIP_METH_INFO)) &&
(onTxSdp(req.cseq, true, req.body) != 0))
(onTxSdp(req.cseq, true, req.body, false) != 0))
{
ILOG_DLG(L_WARN, "onTxSdp() failed\n");
return -1;
@ -458,7 +460,10 @@ int AmOfferAnswer::onReplyOut(AmSipReply& reply, int &flags, AmMimeBody &ret_bod
AmMimeBody* sdp_body = reply.body.hasContentType(SIP_APPLICATION_SDP);
AmMimeBody* csta_body = reply.body.hasContentType(SIP_APPLICATION_CSTA_XML);
bool force_no_sdp_update = false; /* for sequential 183 responses with similar SDP body (version) */
/* for sequential 183 responses with similar SDP body (version)
* or 183 with no SDP body */
bool force_no_sdp_update = false;
bool generate_sdp = sdp_body && !sdp_body->getLen();
bool has_sdp = sdp_body && sdp_body->getLen();
bool has_csta = csta_body && csta_body->getLen();
@ -507,6 +512,13 @@ int AmOfferAnswer::onReplyOut(AmSipReply& reply, int &flags, AmMimeBody &ret_bod
has_sdp = true;
ILOG_DLG(L_DBG, "Now has_sdp has been reset to true.\n");
/* for empty body 183, don't change the state,
* otherwise breaks the OA model exchange
* in later updates during the continued early dialog stage */
force_no_sdp_update = true;
ILOG_DLG(L_DBG, "Forcing no OA state update, because this 183 has no SDP.\n");
/* - 183 reply without SDP body, but is very first one (no SDP saved before)
- 200-299 responses with no SDP */
} else if ((reply.code == 183) || ((reply.code >= 200) && (reply.code < 300))) {
@ -582,7 +594,11 @@ int AmOfferAnswer::onReplyOut(AmSipReply& reply, int &flags, AmMimeBody &ret_bod
if (has_sdp || (has_csta && reply.cseq_method != SIP_METH_INFO)) {
bool is_reliable = dlg->willBeReliable(reply);
if ((onTxSdp(reply.cseq, is_reliable, reply.body, force_no_sdp_update) != 0)) {
if ((onTxSdp(reply.cseq,
is_reliable,
reply.body,
force_no_sdp_update) != 0))
{
ILOG_DLG(L_WARN, "onTxSdp() failed\n");
return -1;
}

Loading…
Cancel
Save