mirror of https://github.com/sipwise/sems.git
If an SDP UPDATE is received after the 183, but before the 200, SEMS fails when it receive the final ACK. In fact SEMS tries to find the SDP content inside the ACK message itself. The solution is copied from sems-pbx module where the issue doesn't happen. Change-Id: Ib9402071c44afa032a45f97e2acd30629e7bc89bchanges/31/23131/5
parent
5fb8d016a3
commit
d0d4dc33c2
@ -0,0 +1,91 @@
|
||||
--- a/core/AmOfferAnswer.cpp
|
||||
+++ b/core/AmOfferAnswer.cpp
|
||||
@@ -53,7 +53,8 @@ AmOfferAnswer::AmOfferAnswer(AmSipDialog
|
||||
cseq(0),
|
||||
sdp_remote(),
|
||||
sdp_local(),
|
||||
- dlg(dlg)
|
||||
+ dlg(dlg),
|
||||
+ force_sdp(true)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -322,7 +323,7 @@ int AmOfferAnswer::onRequestOut(AmSipReq
|
||||
sdp_buf.length());
|
||||
has_sdp = true;
|
||||
}
|
||||
- else {
|
||||
+ else if(force_sdp) {
|
||||
return -1;
|
||||
}
|
||||
} else if (sdp_body && has_sdp) {
|
||||
@@ -395,7 +396,7 @@ int AmOfferAnswer::onReplyOut(AmSipReply
|
||||
else if (reply.code == 200 && reply.cseq_method == SIP_METH_INVITE && state == OA_Completed) {
|
||||
// just ignore if no SDP is generated (required for B2B)
|
||||
}
|
||||
- else return -1;
|
||||
+ else if(force_sdp) return -1;
|
||||
}
|
||||
else {
|
||||
if(!sdp_body){
|
||||
--- a/apps/sbc/CallLeg.cpp
|
||||
+++ b/apps/sbc/CallLeg.cpp
|
||||
@@ -197,7 +197,10 @@ CallLeg::CallLeg(const CallLeg* caller,
|
||||
set_sip_relay_only(false); // will be changed later on (for now we have no peer so we can't relay)
|
||||
|
||||
// enable OA for the purpose of hold request detection
|
||||
- if (dlg) dlg->setOAEnabled(true);
|
||||
+ if (dlg) {
|
||||
+ dlg->setOAEnabled(true);
|
||||
+ dlg->setOAForceSDP(false);
|
||||
+ }
|
||||
else WARN("can't enable OA!\n");
|
||||
|
||||
// code below taken from createCalleeSession
|
||||
@@ -259,7 +262,10 @@ CallLeg::CallLeg(AmSipDialog* p_dlg, AmS
|
||||
set_sip_relay_only(false);
|
||||
|
||||
// enable OA for the purpose of hold request detection
|
||||
- if (dlg) dlg->setOAEnabled(true);
|
||||
+ if (dlg) {
|
||||
+ dlg->setOAEnabled(true);
|
||||
+ dlg->setOAForceSDP(false);
|
||||
+ }
|
||||
else WARN("can't enable OA!\n");
|
||||
}
|
||||
|
||||
--- a/core/AmOfferAnswer.h
|
||||
+++ b/core/AmOfferAnswer.h
|
||||
@@ -53,6 +53,9 @@ private:
|
||||
|
||||
AmSipDialog* dlg;
|
||||
|
||||
+ /** Should SDP generation be forced when not required by standards? */
|
||||
+ bool force_sdp;
|
||||
+
|
||||
/** State maintenance */
|
||||
void saveState();
|
||||
int checkStateChange();
|
||||
@@ -75,6 +78,9 @@ public:
|
||||
void clear();
|
||||
void clearTransitionalState();
|
||||
|
||||
+ void setForceSDP(bool force) { force_sdp = force; }
|
||||
+ bool getForceSDP() const { return force_sdp; }
|
||||
+
|
||||
/** Event handlers */
|
||||
int onRequestIn(const AmSipRequest& req);
|
||||
int onReplyIn(const AmSipReply& reply);
|
||||
--- a/core/AmSipDialog.h
|
||||
+++ b/core/AmSipDialog.h
|
||||
@@ -95,6 +95,10 @@ protected:
|
||||
AmOfferAnswer::OAState getOAState();
|
||||
void setOAState(AmOfferAnswer::OAState n_st);
|
||||
void setOAEnabled(bool oa_enabled);
|
||||
+
|
||||
+ void setOAForceSDP(bool force) { oa.setForceSDP(force); }
|
||||
+ bool getOAForceSDP() const { return oa.getForceSDP(); }
|
||||
+
|
||||
const AmSdp& getLocalSdp() { return oa.getLocalSdp(); }
|
||||
const AmSdp& getRemoteSdp() { return oa.getRemoteSdp(); }
|
||||
|
||||
Loading…
Reference in new issue