[Opalvoip-svn] SF.net SVN: opalvoip:[24609] opal/branches/v3_8
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2010-07-29 07:18:44
|
Revision: 24609 http://opalvoip.svn.sourceforge.net/opalvoip/?rev=24609&view=rev Author: rjongbloed Date: 2010-07-29 07:18:34 +0000 (Thu, 29 Jul 2010) Log Message: ----------- Fixed failure to increment CSeq index in SUBSCRIBE/NOTIFY commands if get a authentication challenge. Modified Paths: -------------- opal/branches/v3_8/include/sip/handlers.h opal/branches/v3_8/include/sip/sippdu.h opal/branches/v3_8/src/sip/handlers.cxx opal/branches/v3_8/src/sip/sipcon.cxx opal/branches/v3_8/src/sip/sipep.cxx opal/branches/v3_8/src/sip/sippdu.cxx Property Changed: ---------------- opal/branches/v3_8/ Property changes on: opal/branches/v3_8 ___________________________________________________________________ Modified: svn:mergeinfo - /opal/branches/Sirius_A:23371,23374,23549,23560,23770 /opal/branches/autoconf:20594-21001 /opal/branches/csoutheren/LalandeBranch1:23412-23413,23415,23424,23510,23516,23553,23577,23607,23669,23724,23742-23744,23747-23748,23755,23758,23780,23788,23848,23850,23856 /opal/branches/rjongbloed/BarnardPlus:20584,20656,20749,20751,20756,20762,20786,20789,20814,20820,20829,20831,20841,20843,20923,20927,20938,22016-22017,22518,22582,22941 /opal/branches/v3_2:21143,21220,21227,21253,21455 /opal/branches/v3_4:21060,21062,21088,21092,21111,21113,21115,21119,21143,21148,21151-21152,21155,21158,21184,21188,21253,21265-21266,21283-21284,21298,21300,21303,21307,21309,21311,21327,21331,21333,21359,21367,21369,21488,21556,21564-21565,21568,21570,21620,21625,21631,21748,21751,21756,21759,21761,21767,21770,22246,23044,23140,23143,23286 /opal/branches/v3_6:22169,22178,22184,22186,22197,22204,22216,22251,22253,22255,22258,22260,22291,22296,22300,22306,22308,22313,22319,22336,22353,22358,22436,22447,22449,22497,22511,22517,22519-22521,22527,22536,22538,22589,22596,22599,22617,22620,22622,22630,22640,22655,22675,22682,22726-22728,22730,22733,22738,22745-22746,22800,22820-22821,22842,22844-22845,22851,22853,22889,22896,22902,22904,22906,22918,22924,22928,22946,22965,22967,22976,22978,22980,22982,22994,23028,23123,23125-23126,23128,23157,23165,23173,23175,23183,23294,23341,23465,23467,23474,23521,23829,24346 /opal/trunk:22308,24052,24056,24103,24181,24189,24191,24193,24195,24197,24206,24211,24229,24233,24238,24240,24264,24276,24279,24282,24301,24397,24402,24469,24475 /ptlib/trunk:20820 + /opal/branches/Sirius_A:23371,23374,23549,23560,23770 /opal/branches/Sirius_B:24604 /opal/branches/autoconf:20594-21001 /opal/branches/csoutheren/LalandeBranch1:23412-23413,23415,23424,23510,23516,23553,23577,23607,23669,23724,23742-23744,23747-23748,23755,23758,23780,23788,23848,23850,23856 /opal/branches/rjongbloed/BarnardPlus:20584,20656,20749,20751,20756,20762,20786,20789,20814,20820,20829,20831,20841,20843,20923,20927,20938,22016-22017,22518,22582,22941 /opal/branches/v3_2:21143,21220,21227,21253,21455 /opal/branches/v3_4:21060,21062,21088,21092,21111,21113,21115,21119,21143,21148,21151-21152,21155,21158,21184,21188,21253,21265-21266,21283-21284,21298,21300,21303,21307,21309,21311,21327,21331,21333,21359,21367,21369,21488,21556,21564-21565,21568,21570,21620,21625,21631,21748,21751,21756,21759,21761,21767,21770,22246,23044,23140,23143,23286 /opal/branches/v3_6:22169,22178,22184,22186,22197,22204,22216,22251,22253,22255,22258,22260,22291,22296,22300,22306,22308,22313,22319,22336,22353,22358,22436,22447,22449,22497,22511,22517,22519-22521,22527,22536,22538,22589,22596,22599,22617,22620,22622,22630,22640,22655,22675,22682,22726-22728,22730,22733,22738,22745-22746,22800,22820-22821,22842,22844-22845,22851,22853,22889,22896,22902,22904,22906,22918,22924,22928,22946,22965,22967,22976,22978,22980,22982,22994,23028,23123,23125-23126,23128,23157,23165,23173,23175,23183,23294,23341,23465,23467,23474,23521,23829,24346 /opal/trunk:22308,24052,24056,24103,24181,24189,24191,24193,24195,24197,24206,24211,24229,24233,24238,24240,24264,24276,24279,24282,24301,24397,24402,24469,24475 /ptlib/trunk:20820 Modified: opal/branches/v3_8/include/sip/handlers.h =================================================================== --- opal/branches/v3_8/include/sip/handlers.h 2010-07-29 05:37:54 UTC (rev 24608) +++ opal/branches/v3_8/include/sip/handlers.h 2010-07-29 07:18:34 UTC (rev 24609) @@ -143,7 +143,7 @@ void RetryLater(unsigned after); PDECLARE_NOTIFIER(PTimer, SIPHandler, OnExpireTimeout); static PBoolean WriteSIPHandler(OpalTransport & transport, void * info); - bool WriteSIPHandler(OpalTransport & transport); + virtual bool WriteSIPHandler(OpalTransport & transport, bool forked); SIPEndPoint & endpoint; @@ -242,6 +242,7 @@ protected: virtual PBoolean SendRequest(SIPHandler::State state); + virtual bool WriteSIPHandler(OpalTransport & transport, bool forked); void SendStatus(SIP_PDU::StatusCodes code, State state); bool DispatchNOTIFY(SIP_PDU & request, SIP_PDU & response); @@ -284,6 +285,7 @@ protected: virtual PBoolean SendRequest(SIPHandler::State state); + virtual bool WriteSIPHandler(OpalTransport & transport, bool forked); SIPEventPackage m_eventPackage; SIPDialogContext m_dialog; Modified: opal/branches/v3_8/include/sip/sippdu.h =================================================================== --- opal/branches/v3_8/include/sip/sippdu.h 2010-07-29 05:37:54 UTC (rev 24608) +++ opal/branches/v3_8/include/sip/sippdu.h 2010-07-29 07:18:34 UTC (rev 24609) @@ -734,7 +734,9 @@ void Update(const SIP_PDU & response); - unsigned GetNextCSeq(unsigned inc = 1) { return m_lastSentCSeq += inc; } + unsigned GetNextCSeq(); + void IncrementCSeq(unsigned inc) { m_lastSentCSeq += inc; } + bool IsDuplicateCSeq(unsigned sequenceNumber); bool IsEstablished() const @@ -747,6 +749,8 @@ bool UsePeerTransportAddress() const { return m_usePeerTransportAddress; } + void SetForking(bool f) { m_forking = f; } + protected: PString m_callId; SIPURL m_requestURI; @@ -758,6 +762,7 @@ unsigned m_lastSentCSeq; unsigned m_lastReceivedCSeq; bool m_usePeerTransportAddress; + bool m_forking; SIPURL m_proxy; }; Modified: opal/branches/v3_8/src/sip/handlers.cxx =================================================================== --- opal/branches/v3_8/src/sip/handlers.cxx 2010-07-29 05:37:54 UTC (rev 24608) +++ opal/branches/v3_8/src/sip/handlers.cxx 2010-07-29 07:18:34 UTC (rev 24609) @@ -261,7 +261,7 @@ } else { // We contacted the server on an interface last time, assume it still works! - if (WriteSIPHandler(*m_transport)) + if (WriteSIPHandler(*m_transport, false)) return true; } @@ -335,11 +335,11 @@ PBoolean SIPHandler::WriteSIPHandler(OpalTransport & transport, void * param) { - return param != NULL && ((SIPHandler *)param)->WriteSIPHandler(transport); + return param != NULL && ((SIPHandler *)param)->WriteSIPHandler(transport, true); } -bool SIPHandler::WriteSIPHandler(OpalTransport & transport) +bool SIPHandler::WriteSIPHandler(OpalTransport & transport, bool /*forked*/) { SIPTransaction * transaction = CreateTransaction(transport); @@ -886,6 +886,15 @@ } +bool SIPSubscribeHandler::WriteSIPHandler(OpalTransport & transport, bool forked) +{ + m_dialog.SetForking(forked); + bool ok = SIPHandler::WriteSIPHandler(transport, forked); + m_dialog.SetForking(false); + return ok; +} + + void SIPSubscribeHandler::SendStatus(SIP_PDU::StatusCodes code, State state) { SIPEndPoint::SubscriptionStatus status; @@ -1514,6 +1523,15 @@ } +bool SIPNotifyHandler::WriteSIPHandler(OpalTransport & transport, bool forked) +{ + m_dialog.SetForking(forked); + bool ok = SIPHandler::WriteSIPHandler(transport, forked); + m_dialog.SetForking(false); + return ok; +} + + bool SIPNotifyHandler::SendNotify(const PObject * body) { if (!LockReadWrite()) Modified: opal/branches/v3_8/src/sip/sipcon.cxx =================================================================== --- opal/branches/v3_8/src/sip/sipcon.cxx 2010-07-29 05:37:54 UTC (rev 24608) +++ opal/branches/v3_8/src/sip/sipcon.cxx 2010-07-29 07:18:34 UTC (rev 24609) @@ -1359,7 +1359,9 @@ ok = WriteINVITE(); else { PWaitAndSignal mutex(transport->GetWriteMutex()); + m_dialog.SetForking(true); ok = transport->WriteConnect(WriteINVITE, this); + m_dialog.SetForking(false); } if (ok) { @@ -2313,10 +2315,6 @@ m_authentication = newAuth; m_authenticatedCseq = cseq; - // Make sure we increment sequence number as the call inside SIPInvite ctor - // will not do so due to prevention to increment on "interface forked" INVITEs - m_dialog.GetNextCSeq(); - transport->SetInterface(transaction.GetInterface()); SIPTransaction * newTransaction; Modified: opal/branches/v3_8/src/sip/sipep.cxx =================================================================== --- opal/branches/v3_8/src/sip/sipep.cxx 2010-07-29 05:37:54 UTC (rev 24608) +++ opal/branches/v3_8/src/sip/sipep.cxx 2010-07-29 07:18:34 UTC (rev 24609) @@ -489,7 +489,7 @@ /* This is an extra increment of the sequence number to allow for any PDU's in the dialog being sent between the last saved context. Highly unlikely this will ever by a million ... */ - context.GetNextCSeq(1000000); + context.IncrementCSeq(1000000); std::auto_ptr<OpalTransport> transport(CreateTransport(context.GetRemoteURI(), context.GetLocalURI().GetHostName())); PSafePtr<SIPTransaction> byeTransaction = new SIPTransaction(SIP_PDU::Method_BYE, *this, *transport); Modified: opal/branches/v3_8/src/sip/sippdu.cxx =================================================================== --- opal/branches/v3_8/src/sip/sippdu.cxx 2010-07-29 05:37:54 UTC (rev 24608) +++ opal/branches/v3_8/src/sip/sippdu.cxx 2010-07-29 07:18:34 UTC (rev 24609) @@ -1702,7 +1702,7 @@ dialog.GetRemoteURI(), dialog.GetLocalURI(), dialog.GetCallID(), - dialog.GetNextCSeq(dialog.IsEstablished() && m_method != Method_ACK ? 1 : 0), + dialog.GetNextCSeq(), via); SetRoute(dialog.GetRouteSet()); m_usePeerTransportAddress = dialog.UsePeerTransportAddress(); @@ -2229,9 +2229,10 @@ SIPDialogContext::SIPDialogContext() : m_callId(SIPTransaction::GenerateCallID()) - , m_lastSentCSeq(1) + , m_lastSentCSeq(0) , m_lastReceivedCSeq(0) , m_usePeerTransportAddress(false) + , m_forking(false) { } @@ -2400,6 +2401,15 @@ } +unsigned SIPDialogContext::GetNextCSeq() +{ + if (m_forking && m_lastSentCSeq > 0) + return m_lastSentCSeq; + + return ++m_lastSentCSeq; +} + + bool SIPDialogContext::IsDuplicateCSeq(unsigned requestCSeq) { /* See if have had a mesage before and this one is older than the last, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |