Always update dialog uri from Contact header when handling 2xx answer to INVITE. Added option (default: disable) to also change party if autochangeparty is enabled.

git-svn-id: http://voip.null.ro/svn/yate@6369 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
marian 2019-11-13 11:18:31 +00:00
parent 93677a25be
commit 614e4caf04
2 changed files with 16 additions and 14 deletions

View File

@ -294,6 +294,12 @@
; This parameter is applied on reload
;autochangeparty=disable
; change_party_2xx: bool: Change party when handling 2xx response to INVITE
; Defaults to disable
; This parameter is applied on reload
; This parameter is ignored if 'autochangeparty' is disabled
;change_party_2xx=disable
; ssl_certificate_file: string: File containing client SSL certificate to present
; This parameter is used for outgoing encrypted connections if a certificate
; is requested by the server during SSL negotiation

View File

@ -1031,7 +1031,7 @@ private:
void startPendingUpdate();
bool processTransaction2(SIPEvent* ev, const SIPMessage* msg, int code);
SIPMessage* createDlgMsg(const char* method, const char* uri = 0);
void updateTarget(const SIPMessage* msg);
void updateTarget(const SIPMessage* msg, bool force = false, bool chgParty = true);
void emitUpdate();
bool emitPRACK(const SIPMessage* msg);
bool startClientReInvite(NamedList& msg, bool rtpForward);
@ -1233,6 +1233,7 @@ static bool s_update_target = false;
static bool s_update_verify = false;
static bool s_preventive_bye = true;
static bool s_ignoreVia = true; // Ignore Via headers and send answer back to the source
static bool s_changeParty2xx = false; // Change party when handling 2xx. Ignored if autochangeparty is disabled
static bool s_sipt_isup = false; // Control the application/isup body processing
static bool s_printMsg = true; // Print sent/received SIP messages to output
static ObjList* s_authCopyHeader = 0; // Copy headers in user.auth
@ -6644,20 +6645,22 @@ SIPMessage* YateSIPConnection::createDlgMsg(const char* method, const char* uri)
}
// Update the dialog from received target refresh message
void YateSIPConnection::updateTarget(const SIPMessage* msg)
void YateSIPConnection::updateTarget(const SIPMessage* msg, bool force, bool chgParty)
{
if (!s_update_target)
if (!(s_update_target || force))
return;
if (!msg)
return;
const MimeHeaderLine* co = msg->getHeader("Contact");
if (co) {
// (re)INVITE had a Contact: header - change remote URI
String old = m_uri;
m_uri = *co;
m_uri.parse();
m_dialog.remoteURI = m_uri;
if (old != m_uri)
Debug(this,DebugInfo,"Dialog URI changed '%s' -> '%s' [%p]",old.c_str(),m_uri.c_str(),this);
}
if (!m_autoChangeParty)
if (!(m_autoChangeParty && chgParty))
return;
SIPParty* party = msg->getParty();
if (party) {
@ -6980,11 +6983,9 @@ bool YateSIPConnection::process(SIPEvent* ev)
updateTags = false;
m_cancel = false;
Lock lock(driver());
updateTarget(msg,true,s_changeParty2xx);
const SIPMessage* ack = m_tr ? m_tr->latestMessage() : 0;
if (ack && ack->isACK()) {
// accept any URI change caused by a Contact: header in the 2xx
m_uri = ack->uri;
m_uri.parse();
DDebug(this,DebugInfo,"YateSIPConnection clearing answered transaction %p [%p]",
m_tr,this);
m_tr->setUserData(0);
@ -7003,12 +7004,6 @@ bool YateSIPConnection::process(SIPEvent* ev)
if (tr->autoAck())
startPendingUpdate();
else if (!m_rtpForward) {
const MimeHeaderLine* co = msg->getHeader("Contact");
if (co) {
Lock lck(driver());
m_uri = *co;
m_uri.parse();
}
MimeSdpBody* sdp = m_rtpMedia ? createRtpSDP(true) : 0;
Debug(this,DebugNote,"Sending ACK %s SDP now since RTP is not forwarded [%p]",
(sdp ? "with" : "without"),this);
@ -9370,6 +9365,7 @@ void SIPDriver::initialize()
s_1xx_formats = s_cfg.getBoolValue("hacks","1xx_change_formats",true);
s_sdp_implicit = s_cfg.getBoolValue("hacks","sdp_implicit",true);
s_rtp_preserve = s_cfg.getBoolValue("hacks","ignore_sdp_addr",false);
s_changeParty2xx = s_cfg.getBoolValue("general","change_party_2xx",false);
m_parser.initialize(s_cfg.getSection("codecs"),s_cfg.getSection("hacks"),s_cfg.getSection("general"));
if (!m_endpoint) {
Thread::Priority prio = Thread::priority(s_cfg.getValue("general","thread"));