summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbeg_g <beg_g@09dcff7a-b715-0410-9601-b79a96267cd0>2009-10-19 14:55:46 +0000
committerbeg_g <beg_g@09dcff7a-b715-0410-9601-b79a96267cd0>2009-10-19 14:55:46 +0000
commit747f19b5e2f1777639398d42a05812834d2c648f (patch)
tree887cf19ee1a4a825f1b0225cf298718b433751ab
parent5c384d7eb82121e418aa62f97af247c30756d529 (diff)
Added support for the SIP response "302 Moved Temporarily". The way this works is that the "Contact" header is mapped to the "To" header such that a subsequent INVITE based on the "302 Moved Temporarily" response shall have the correct remote party parameter. This functionality is by default enabled and can be disabled by setting the parameter Sip302MovedTemporarilySupport to 'false'.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@647 09dcff7a-b715-0410-9601-b79a96267cd0
-rw-r--r--orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h2
-rw-r--r--orkaudio/audiocaptureplugins/voip/RtpSession.cpp89
-rw-r--r--orkaudio/audiocaptureplugins/voip/RtpSession.h22
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIp.cpp206
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp2
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIpConfig.h1
6 files changed, 305 insertions, 17 deletions
diff --git a/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h b/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h
index fbc547e..5ea6f45 100644
--- a/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h
+++ b/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h
@@ -391,12 +391,14 @@ struct Iax2MetaTrunkEntryTs {
#define SIP_METHOD_BYE_SIZE 3
#define SIP_RESPONSE_200_OK_SIZE 11
#define SIP_RESPONSE_SESSION_PROGRESS_SIZE 28
+#define SIP_RESPONSE_302_MOVED_TEMPORARILY_SIZE 29
#define SIP_METHOD_INVITE "INVITE"
#define SIP_METHOD_ACK "ACK"
#define SIP_METHOD_BYE "BYE"
#define SIP_METHOD_200_OK "200 OK"
#define SIP_RESPONSE_200_OK "SIP/2.0 200"
#define SIP_RESPONSE_SESSION_PROGRESS "SIP/2.0 183 Session Progress"
+#define SIP_RESPONSE_302_MOVED_TEMPORARILY "SIP/2.0 302 Moved Temporarily"
#endif
diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp
index f571212..654a6e6 100644
--- a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp
+++ b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp
@@ -107,6 +107,9 @@ void RtpSession::ReportRtcpSrcDescription(RtcpSrcDescriptionPacketInfoRef& rtcpI
}
m_localParty.Format("%s@%s", rtcpInfo->m_cnameUsername, realm);
+ CStdString lp;
+ lp = m_localParty;
+ m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(lp);
}
else
{
@@ -155,11 +158,12 @@ void RtpSession::ReportRtcpSrcDescription(RtcpSrcDescriptionPacketInfoRef& rtcpI
if(DLLCONFIG.m_inInMode == true)
{
- m_remoteParty = testParty;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(testParty);
}
else
{
- m_remoteParty = rtcpInfo->m_cnameUsername;
+ CStdString rp = rtcpInfo->m_cnameUsername;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(rp);
}
LOG4CXX_INFO(m_log, "[" + m_trackingId + "] Set remote party to RTCP CNAME:" + m_remoteParty);
@@ -264,7 +268,8 @@ void RtpSession::ProcessMetadataRawRtp(RtpPacketInfoRef& rtpPacket)
}
if(!m_rtcpRemoteParty)
{
- m_remoteParty = szDestIp;
+ CStdString rp(szDestIp);
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(rp);
}
m_localIp = rtpPacket->m_sourceIp;
@@ -290,7 +295,8 @@ void RtpSession::ProcessMetadataRawRtp(RtpPacketInfoRef& rtpPacket)
}
if(!m_rtcpRemoteParty)
{
- m_remoteParty = szSourceIp;
+ CStdString rp(szSourceIp);
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(rp);
}
m_localIp = rtpPacket->m_destIp;
@@ -334,13 +340,13 @@ void RtpSession::ProcessMetadataSipIncoming()
if((DLLCONFIG.m_sipRequestUriAsLocalParty == true) && (m_invite->m_requestUri.CompareNoCase(m_invite->m_to) != 0))
{
m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_requestUri);
- m_remoteParty = m_invite->m_from;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_from);
m_direction = CaptureEvent::DirIn;
m_localEntryPoint = m_invite->m_to;
}
else
{
- m_remoteParty = m_invite->m_from;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_from);
m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_to);
m_direction = CaptureEvent::DirIn;
}
@@ -369,13 +375,13 @@ void RtpSession::ProcessMetadataSipOutgoing()
if((DLLCONFIG.m_sipRequestUriAsLocalParty == true) && (m_invite->m_requestUri.CompareNoCase(m_invite->m_to) != 0))
{
m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_requestUri);
- m_remoteParty = m_invite->m_from;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_from);
m_direction = CaptureEvent::DirIn;
m_localEntryPoint = m_invite->m_to;
}
else
{
- m_remoteParty = m_invite->m_to;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_to);
m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_from);
m_direction = CaptureEvent::DirOut;
}
@@ -463,13 +469,13 @@ void RtpSession::UpdateMetadataSip(RtpPacketInfoRef& rtpPacket, bool sourceRtpAd
if((DLLCONFIG.m_sipRequestUriAsLocalParty == true) && (m_invite->m_requestUri.CompareNoCase(m_invite->m_to) != 0))
{
m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_requestUri);
- m_remoteParty = m_invite->m_from;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(m_invite->m_from);
m_direction = CaptureEvent::DirIn;
m_localEntryPoint = m_invite->m_to;
}
else
{
- m_remoteParty = invite->m_from;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_from);
m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_to);
}
@@ -1184,13 +1190,13 @@ void RtpSession::ReportSipBye(SipByeInfoRef& bye)
if(m_localParty.CompareNoCase(translatedTo) != 0)
{
// localparty is set to m_from
- m_remoteParty = bye->m_to;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_to);
logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from BYE:%s", m_trackingId, m_remoteParty, byeString);
}
else
{
// localparty is set to m_to
- m_remoteParty = bye->m_from;
+ m_remoteParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_from);
logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from BYE:%s", m_trackingId, m_remoteParty, byeString);
}
@@ -1561,6 +1567,34 @@ void RtpSessions::ReportSipSessionProgress(SipSessionProgressInfoRef& info)
}
}
+void RtpSessions::ReportSip302MovedTemporarily(Sip302MovedTemporarilyInfoRef& info)
+{
+ CStdString m_trackingId;
+
+ // Contact: is mapped to the To:
+ SaveLocalPartyMap(info->m_contact, info->m_to);
+
+ // If there is already a session, log that information
+ std::map<CStdString, RtpSessionRef>::iterator pair;
+
+ pair = m_byCallId.find(info->m_callId);
+ if (pair != m_byCallId.end())
+ {
+ RtpSessionRef session = pair->second;
+
+ m_trackingId = session->m_trackingId;
+ }
+
+ if(m_trackingId.size())
+ {
+ LOG4CXX_INFO(m_log, "[" + m_trackingId + "] " + info->m_contact + " mapped to " + info->m_to + " by SIP 302 Moved Temporarily");
+ }
+ else
+ {
+ LOG4CXX_INFO(m_log, info->m_contact + " mapped to " + info->m_to + " by SIP 302 Moved Temporarily (session unknown)");
+ }
+}
+
void RtpSessions::ReportSip200Ok(Sip200OkInfoRef info)
{
std::map<CStdString, RtpSessionRef>::iterator pair;
@@ -1652,6 +1686,7 @@ void RtpSessions::UpdateSessionWithCallInfo(SkCallInfoStruct* callInfo, RtpSessi
{
session->m_skinnyLineInstance = callInfo->lineInstance;
CStdString lp;
+ CStdString rp;
CStdString logMsg;
char szEndPointIp[16];
@@ -1662,12 +1697,14 @@ void RtpSessions::UpdateSessionWithCallInfo(SkCallInfoStruct* callInfo, RtpSessi
{
case SKINNY_CALL_TYPE_INBOUND:
lp = callInfo->calledParty;
+ rp = callInfo->callingParty;
session->m_localParty = GetLocalPartyMap(lp);
- session->m_remoteParty = callInfo->callingParty;
+ session->m_remoteParty = GetLocalPartyMap(rp);
session->m_direction = CaptureEvent::DirIn;
break;
case SKINNY_CALL_TYPE_FORWARD:
lp = callInfo->calledParty;
+ rp = callInfo->callingParty;
if(endpoint.get() && ((endpoint->m_extension).size() > 0))
{
session->m_localParty = GetLocalPartyMap(endpoint->m_extension);
@@ -1675,19 +1712,21 @@ void RtpSessions::UpdateSessionWithCallInfo(SkCallInfoStruct* callInfo, RtpSessi
logMsg.Format("[%s] callType is FORWARD: set localparty:%s (obtained from endpoint:%s)", session->m_trackingId, session->m_localParty, szEndPointIp);
LOG4CXX_DEBUG(m_log, logMsg);
}
- session->m_remoteParty = callInfo->callingParty;
+ session->m_remoteParty = GetLocalPartyMap(rp);
session->m_direction = CaptureEvent::DirIn;
break;
case SKINNY_CALL_TYPE_OUTBOUND:
lp = callInfo->callingParty;
+ rp = callInfo->calledParty;
session->m_localParty = GetLocalPartyMap(lp);
- session->m_remoteParty = callInfo->calledParty;
+ session->m_remoteParty = GetLocalPartyMap(rp);
session->m_direction = CaptureEvent::DirOut;
break;
default:
lp = callInfo->calledParty;
+ rp = callInfo->callingParty;
session->m_localParty = GetLocalPartyMap(lp);
- session->m_remoteParty = callInfo->callingParty;
+ session->m_remoteParty = GetLocalPartyMap(rp);
}
}
@@ -3103,6 +3142,24 @@ void SipInviteInfo::ToString(CStdString& string)
}
//==========================================================
+Sip302MovedTemporarilyInfo::Sip302MovedTemporarilyInfo()
+{
+ m_senderIp.s_addr = 0;
+ m_receiverIp.s_addr = 0;
+}
+
+void Sip302MovedTemporarilyInfo::ToString(CStdString& string)
+{
+ char senderIp[16];
+ char receiverIp[16];
+
+ ACE_OS::inet_ntop(AF_INET, (void*)&m_senderIp, senderIp, sizeof(senderIp));
+ ACE_OS::inet_ntop(AF_INET, (void*)&m_receiverIp, receiverIp, sizeof(receiverIp));
+
+ string.Format("sender:%s rcvr:%s from:%s@%s to:%s@%s contact:%s@%s fromname:%s toname:%s contactname:%s callid:%s", senderIp, receiverIp, m_from, m_fromDomain, m_to, m_toDomain, m_contact, m_contactDomain, m_fromName, m_toName, m_contactName, m_callId);
+}
+
+//==========================================================
SipFailureMessageInfo::SipFailureMessageInfo()
{
m_senderIp.s_addr = 0;
diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.h b/orkaudio/audiocaptureplugins/voip/RtpSession.h
index a205e63..ec14d1e 100644
--- a/orkaudio/audiocaptureplugins/voip/RtpSession.h
+++ b/orkaudio/audiocaptureplugins/voip/RtpSession.h
@@ -24,6 +24,27 @@
using namespace log4cxx;
+class Sip302MovedTemporarilyInfo
+{
+public:
+ Sip302MovedTemporarilyInfo();
+ void ToString(CStdString& string);
+
+ struct in_addr m_senderIp;
+ struct in_addr m_receiverIp;
+ CStdString m_from;
+ CStdString m_to;
+ CStdString m_contact;
+ CStdString m_callId;
+ CStdString m_fromDomain;
+ CStdString m_toDomain;
+ CStdString m_contactDomain;
+ CStdString m_fromName;
+ CStdString m_toName;
+ CStdString m_contactName;
+};
+typedef boost::shared_ptr<Sip302MovedTemporarilyInfo> Sip302MovedTemporarilyInfoRef;
+
class SipInviteInfo
{
public:
@@ -273,6 +294,7 @@ public:
void ReportSipErrorPacket(SipFailureMessageInfoRef& sipError);
void ReportSip200Ok(Sip200OkInfoRef info);
void ReportSipSessionProgress(SipSessionProgressInfoRef& info);
+ void ReportSip302MovedTemporarily(Sip302MovedTemporarilyInfoRef& info);
void Hoover(time_t now);
EndpointInfoRef GetEndpointInfo(struct in_addr endpointIp);
CStdString StartCapture(CStdString& party);
diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp
index 9faab82..d36b0bc 100644
--- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp
+++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp
@@ -2142,6 +2142,203 @@ bool TrySip200Ok(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader,
return result;
}
+bool TrySip302MovedTemporarily(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader, UdpHeaderStruct* udpHeader, u_char* udpPayload, u_char* packetEnd)
+{
+ bool result = false;
+ bool drop = false;
+
+ if(DLLCONFIG.m_sip302MovedTemporarilySupport == false)
+ {
+ return false;
+ }
+
+ int sipLength = ntohs(udpHeader->len) - sizeof(UdpHeaderStruct);
+ char* sipEnd = (char*)udpPayload + sipLength;
+ CStdString sipMethod = "302 Moved Temporarily";
+
+ if(sipLength < SIP_RESPONSE_302_MOVED_TEMPORARILY_SIZE || sipEnd > (char*)packetEnd)
+ {
+ drop = true; // packet too short
+ }
+ else if(memcmp(SIP_RESPONSE_302_MOVED_TEMPORARILY, (void*)udpPayload, SIP_RESPONSE_302_MOVED_TEMPORARILY_SIZE) != 0)
+ {
+ drop = true;
+ }
+
+ if(drop == false)
+ {
+ result = true;
+
+ Sip302MovedTemporarilyInfoRef info(new Sip302MovedTemporarilyInfo());
+
+ char* fromField = memFindAfter("From:", (char*)udpPayload, sipEnd);
+ if(!fromField)
+ {
+ fromField = memFindAfter("\nf:", (char*)udpPayload, sipEnd);
+ }
+ char* toField = memFindAfter("To:", (char*)udpPayload, sipEnd);
+ if(!toField)
+ {
+ toField = memFindAfter("\nt:", (char*)udpPayload, sipEnd);
+ }
+ char* callIdField = memFindAfter("Call-ID:", (char*)udpPayload, sipEnd);
+ if(!callIdField)
+ {
+ callIdField = memFindAfter("\ni:", (char*)udpPayload, sipEnd);
+ }
+ char* contactField = memFindAfter("Contact:", (char*)udpPayload, sipEnd);
+ if(!contactField)
+ {
+ contactField = memFindAfter("\nc:", (char*)udpPayload, sipEnd);
+ }
+
+ if(fromField)
+ {
+ if(s_sipExtractionLog->isDebugEnabled())
+ {
+ CStdString from;
+ GrabLine(fromField, sipEnd, from);
+ LOG4CXX_DEBUG(s_sipExtractionLog, "from: " + from);
+ }
+
+ char* fromFieldEnd = memFindEOL(fromField, sipEnd);
+
+ GrabSipName(fromField, fromFieldEnd, info->m_fromName);
+
+ char* sipUser = memFindAfter("sip:", fromField, fromFieldEnd);
+ if(sipUser)
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(sipUser, fromFieldEnd, info->m_from);
+ }
+ else
+ {
+ GrabSipUriUser(sipUser, fromFieldEnd, info->m_from);
+ }
+ GrabSipUriDomain(sipUser, fromFieldEnd, info->m_fromDomain);
+ }
+ else
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(fromField, fromFieldEnd, info->m_from);
+ }
+ else
+ {
+ GrabSipUriUser(fromField, fromFieldEnd, info->m_from);
+ }
+ GrabSipUriDomain(fromField, fromFieldEnd, info->m_fromDomain);
+ }
+ }
+ if(toField)
+ {
+ CStdString to;
+ char* toFieldEnd = GrabLine(toField, sipEnd, to);
+ LOG4CXX_DEBUG(s_sipExtractionLog, "to: " + to);
+
+ GrabSipName(toField, toFieldEnd, info->m_toName);
+
+ char* sipUser = memFindAfter("sip:", toField, toFieldEnd);
+ if(sipUser)
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(sipUser, toFieldEnd, info->m_to);
+ }
+ else
+ {
+ GrabSipUriUser(sipUser, toFieldEnd, info->m_to);
+ }
+ GrabSipUriDomain(sipUser, toFieldEnd, info->m_toDomain);
+ }
+ else
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(toField, toFieldEnd, info->m_to);
+ }
+ else
+ {
+ GrabSipUriUser(toField, toFieldEnd, info->m_to);
+ }
+ GrabSipUriDomain(toField, toFieldEnd, info->m_toDomain);
+ }
+ }
+ if(contactField)
+ {
+ CStdString contact;
+ char* contactFieldEnd = GrabLine(contactField, sipEnd, contact);
+ LOG4CXX_DEBUG(s_sipExtractionLog, "contact: " + contact);
+
+ GrabSipName(contactField, contactFieldEnd, info->m_contactName);
+
+ char* sipUser = memFindAfter("sip:", contactField, contactFieldEnd);
+ if(sipUser)
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(sipUser, contactFieldEnd, info->m_contact);
+ }
+ else
+ {
+ GrabSipUriUser(sipUser, contactFieldEnd, info->m_contact);
+ }
+ GrabSipUriDomain(sipUser, contactFieldEnd, info->m_contactDomain);
+ }
+ else
+ {
+ if(DLLCONFIG.m_sipReportFullAddress)
+ {
+ GrabSipUserAddress(contactField, contactFieldEnd, info->m_contact);
+ }
+ else
+ {
+ GrabSipUriUser(contactField, contactFieldEnd, info->m_contact);
+ }
+ GrabSipUriDomain(contactField, contactFieldEnd, info->m_contactDomain);
+ }
+
+ }
+ if(callIdField)
+ {
+ GrabTokenSkipLeadingWhitespaces(callIdField, sipEnd, info->m_callId);
+ }
+
+ info->m_senderIp = ipHeader->ip_src;
+ info->m_receiverIp = ipHeader->ip_dest;
+
+ if(!info->m_callId.size())
+ {
+ drop = true;
+ }
+ if(!info->m_contact)
+ {
+ drop = true;
+ }
+
+ CStdString logMsg;
+ info->ToString(logMsg);
+ logMsg = sipMethod + ": " + logMsg;
+ LOG4CXX_INFO(s_sipPacketLog, logMsg);
+
+ if(drop == false)
+ {
+ RtpSessionsSingleton::instance()->ReportSip302MovedTemporarily(info);
+ }
+ else
+ {
+ CStdString packetInfo;
+
+ info->ToString(packetInfo);
+ logMsg.Format("Dropped this %s: %s", sipMethod, packetInfo);
+ LOG4CXX_INFO(s_sipPacketLog, logMsg);
+ }
+ }
+
+ return result;
+}
+
bool TrySipInvite(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader, UdpHeaderStruct* udpHeader, u_char* udpPayload, u_char* packetEnd)
{
bool result = false;
@@ -2960,7 +3157,14 @@ void HandlePacket(u_char *param, const struct pcap_pkthdr *header, const u_char
if(!detectedUsefulPacket) {
if(DLLCONFIG.m_sipDetectSessionProgress == true)
{
- TrySipSessionProgress(ethernetHeader, ipHeader, udpHeader, udpPayload, ipPacketEnd);
+ detectedUsefulPacket = TrySipSessionProgress(ethernetHeader, ipHeader, udpHeader, udpPayload, ipPacketEnd);
+ }
+ }
+
+ if(!detectedUsefulPacket) {
+ if(DLLCONFIG.m_sip302MovedTemporarilySupport == true)
+ {
+ detectedUsefulPacket = TrySip302MovedTemporarily(ethernetHeader, ipHeader, udpHeader, udpPayload, ipPacketEnd);
}
}
diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp
index 69d51d7..216302e 100644
--- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp
+++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp
@@ -52,6 +52,7 @@ VoIpConfig::VoIpConfig()
m_sipRequestUriAsLocalParty = true;
m_sipTreat200OkAsInvite = false;
m_sipAllowMultipleMediaAddresses = false;
+ m_sip302MovedTemporarilySupport = true;
m_rtcpDetect = false;
m_inInMode = false;
@@ -131,6 +132,7 @@ void VoIpConfig::Define(Serializer* s)
s->BoolValue("SipRequestUriAsLocalParty", m_sipRequestUriAsLocalParty);
s->BoolValue("SipTreat200OkAsInvite", m_sipTreat200OkAsInvite);
s->BoolValue("SipAllowMultipleMediaAddresses", m_sipAllowMultipleMediaAddresses);
+ s->BoolValue("Sip302MovedTemporarilySupport", m_sip302MovedTemporarilySupport);
s->BoolValue("RtcpDetect", m_rtcpDetect);
s->BoolValue("InInMode", m_inInMode);
diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h
index d853b85..5bdadca 100644
--- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h
+++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h
@@ -89,6 +89,7 @@ public:
bool m_sipRequestUriAsLocalParty;
bool m_sipTreat200OkAsInvite;
bool m_sipAllowMultipleMediaAddresses;
+ bool m_sip302MovedTemporarilySupport;
bool m_rtcpDetect;
bool m_inInMode;