From 7de893f3c196cdb79043a28cdc5906343ddc13f6 Mon Sep 17 00:00:00 2001 From: paulc Date: Tue, 3 Jul 2018 12:19:25 +0000 Subject: [PATCH] Added support for following forked transactions' 1xx provisional messages. git-svn-id: http://voip.null.ro/svn/yate@6318 acf43c95-373e-0410-b603-e72c3f656dc1 --- conf.d/ysipchan.conf.sample | 5 +++++ modules/ysipchan.cpp | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/conf.d/ysipchan.conf.sample b/conf.d/ysipchan.conf.sample index 66b5fc52..4795c4a7 100644 --- a/conf.d/ysipchan.conf.sample +++ b/conf.d/ysipchan.conf.sample @@ -154,6 +154,11 @@ ; This parameter is applied on reload ;fork=enable +; fork_early: bool: Also follow forked 1xx on early dialogs +; Ignored if fork following on 2xx is disabled +; This parameter is applied on reload +;fork_early=disable + ; progress: bool: Send an "183 Session Progress" just after successfull routing ;progress=disable diff --git a/modules/ysipchan.cpp b/modules/ysipchan.cpp index 839abb4d..ac27ab31 100644 --- a/modules/ysipchan.cpp +++ b/modules/ysipchan.cpp @@ -672,6 +672,7 @@ private: bool m_prack; bool m_info; bool m_fork; + bool m_forkEarly; bool m_foreignAuth; }; @@ -4555,6 +4556,7 @@ void YateSIPEngine::initialize(NamedList* params) params = &dummy; lazyTrying(params->getBoolValue("lazy100",false)); m_fork = params->getBoolValue("fork",true); + m_forkEarly = params->getBoolValue("fork_early",false); m_flags = params->getIntValue("flags",m_flags); m_foreignAuth = params->getBoolValue("auth_foreign",false); m_reqTransCount = params->getIntValue("sip_req_trans_count",4,2,10,false); @@ -4572,12 +4574,18 @@ void YateSIPEngine::initialize(NamedList* params) SIPTransaction* YateSIPEngine::forkInvite(SIPMessage* answer, SIPTransaction* trans) { - if (m_fork && trans->isActive() && (answer->code/100) == 2) - { - Debug(this,DebugNote,"Changing early dialog tag because of forked 2xx"); - trans->setDialogTag(answer->getParamValue("To","tag")); - trans->processMessage(answer); - return trans; + if (m_fork && (answer->code > 100) && trans->isActive()) { + switch (answer->code / 100) { + case 1: + if (!m_forkEarly) + break; + // fall through + case 2: + Debug(this,DebugNote,"Changing early dialog tag because of forked %d",answer->code); + trans->setDialogTag(answer->getParamValue("To","tag")); + trans->processMessage(answer); + return trans; + } } return SIPEngine::forkInvite(answer,trans); }