From d9e471cb8b3a7e79407b9614212d6b93a2b69427 Mon Sep 17 00:00:00 2001 From: Henri Herscher Date: Wed, 19 Sep 2007 18:21:47 +0000 Subject: Added SipUse200OkMediaAddress configuration switch. If enabled, SIP 200 OK SDP media address prevails over INVITE SDP media address. git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@492 09dcff7a-b715-0410-9601-b79a96267cd0 --- orkaudio/audiocaptureplugins/voip/RtpSession.cpp | 43 +++++++++++------------- orkaudio/audiocaptureplugins/voip/RtpSession.h | 4 +-- orkaudio/audiocaptureplugins/voip/VoIp.cpp | 15 ++++++--- orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp | 2 ++ orkaudio/audiocaptureplugins/voip/VoIpConfig.h | 1 + 5 files changed, 35 insertions(+), 30 deletions(-) (limited to 'orkaudio/audiocaptureplugins') diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp index efb43a8..9a3b46a 100644 --- a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp +++ b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp @@ -310,7 +310,11 @@ void RtpSession::ProcessMetadataSip(RtpPacketInfoRef& rtpPacket) } else { - LOG4CXX_ERROR(m_log, "[" + m_trackingId + "] " + m_ipAndPort + " alien RTP packet"); + m_inviteeIp = rtpPacket->m_sourceIp; + m_inviteeTcpPort = rtpPacket->m_sourcePort; + m_invitorTcpPort = rtpPacket->m_destPort; + memcpy(m_inviteeMac, rtpPacket->m_sourceMac, sizeof(m_inviteeMac)); + LOG4CXX_WARN(m_log, "[" + m_trackingId + "] " + m_ipAndPort + " alien RTP packet"); } // work out capture port and direction @@ -933,30 +937,23 @@ void RtpSessions::ReportSip200Ok(Sip200OkInfoRef info) { RtpSessionRef session = pair->second; - if(info->m_hasSdp && DLLCONFIG.IsPartOfLan(session->m_fromRtpIp) && !DLLCONFIG.IsPartOfLan(info->m_fromRtpIp) && !session->m_numRtpPackets) + //if(info->m_hasSdp && DLLCONFIG.IsPartOfLan(session->m_fromRtpIp) && !DLLCONFIG.IsPartOfLan(info->m_fromRtpIp) && !session->m_numRtpPackets) + if(info->m_hasSdp && DLLCONFIG.m_sipUse200OkMediaAddress && !session->m_numRtpPackets) { - char szFromRtpIp[16]; - - ACE_OS::inet_ntop(AF_INET, (void*)&info->m_fromRtpIp, szFromRtpIp, sizeof(szFromRtpIp)); - m_byIpAndPort.erase(session->m_ipAndPort); - session->m_ipAndPort = CStdString(szFromRtpIp) + "," + info->m_fromRtpPort; - - pair = m_byIpAndPort.find(session->m_ipAndPort); - if (pair != m_byIpAndPort.end()) - { - RtpSessionRef session2 = pair->second; - - if(session2->m_protocol == RtpSession::ProtRawRtp) - { - Stop(session2); - } - } - - m_byIpAndPort.insert(std::make_pair(session->m_ipAndPort, session)); - - LOG4CXX_INFO(m_log, "[" + session->m_trackingId + "] updated RTP address: " + session->m_ipAndPort); + unsigned short mediaPort = ACE_OS::atoi(info->m_mediaPort); + SetMediaAddress(session, info->m_mediaIp, mediaPort); } + //else + //{ + // CStdString logString; + // logString.Format("hasSDP:%d use200:%d numRtpPkts:%d callId:%s", info->m_hasSdp, DLLCONFIG.m_sipUse200OkMediaAddress, session->m_numRtpPackets, info->m_callId); + // LOG4CXX_INFO(m_log, "[" + session->m_trackingId + "] 200Ok RTP address not updated: " + session->m_ipAndPort + " " + logString ); + //} } + //else + //{ + // LOG4CXX_INFO(m_log, "200OK Did not find " + info->m_callId); + //} } void RtpSessions::ReportSipBye(SipByeInfo bye) @@ -1796,7 +1793,7 @@ void SipFailureMessageInfo::ToString(CStdString& string) Sip200OkInfo::Sip200OkInfo() { - m_fromRtpIp.s_addr = 0; + m_mediaIp.s_addr = 0; m_hasSdp = false; } diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.h b/orkaudio/audiocaptureplugins/voip/RtpSession.h index ec9d262..02cc7ce 100644 --- a/orkaudio/audiocaptureplugins/voip/RtpSession.h +++ b/orkaudio/audiocaptureplugins/voip/RtpSession.h @@ -77,8 +77,8 @@ public: Sip200OkInfo(); CStdString m_callId; bool m_hasSdp; - struct in_addr m_fromRtpIp; - CStdString m_fromRtpPort; + struct in_addr m_mediaIp; + CStdString m_mediaPort; }; typedef boost::shared_ptr Sip200OkInfoRef; diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp index 013a79a..d85d05c 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp @@ -1396,7 +1396,12 @@ bool TrySip200Ok(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader, Sip200OkInfoRef info(new Sip200OkInfo()); - char* callIdField = memFindAfter("\r\ni:", (char*)udpPayload, sipEnd); + char* callIdField = memFindAfter("Call-ID:", (char*)udpPayload, sipEnd); + if(!callIdField) + { + callIdField = memFindAfter("\ni:", (char*)udpPayload, sipEnd); + } + char* audioField = NULL; char* connectionAddressField = NULL; @@ -1410,16 +1415,16 @@ bool TrySip200Ok(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader, { info->m_hasSdp = true; - GrabToken(audioField, sipEnd, info->m_fromRtpPort); + GrabToken(audioField, sipEnd, info->m_mediaPort); CStdString connectionAddress; GrabToken(connectionAddressField, sipEnd, connectionAddress); - struct in_addr fromIp; + struct in_addr mediaIp; if(connectionAddress.size()) { - if(ACE_OS::inet_aton((PCSTR)connectionAddress, &fromIp)) + if(ACE_OS::inet_aton((PCSTR)connectionAddress, &mediaIp)) { - info->m_fromRtpIp = fromIp; + info->m_mediaIp = mediaIp; } } } diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp index b2a5058..fdad117 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp @@ -40,6 +40,7 @@ VoIpConfig::VoIpConfig() m_rtpDetectOnOddPorts = false; m_sipOverTcpSupport = false; // Disabled by default m_sipLogFailedCalls = false; + m_sipUse200OkMediaAddress = false; m_useMacIfNoLocalParty = false; // Uses IP address by default @@ -84,6 +85,7 @@ void VoIpConfig::Define(Serializer* s) s->CsvValue("SipExtractFields", m_sipExtractFields); s->BoolValue("SipOverTcpSupport", m_sipOverTcpSupport); s->BoolValue("SipLogFailedCalls", m_sipLogFailedCalls); + s->BoolValue("SipUse200OkMediaAddress", m_sipUse200OkMediaAddress); s->BoolValue("UseMacIfNoLocalParty", m_useMacIfNoLocalParty); s->BoolValue("SkinnyIgnoreStopMediaTransmission", m_skinnyIgnoreStopMediaTransmission); diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h index 7305588..2771732 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h @@ -74,6 +74,7 @@ public: bool m_iax2Support; bool m_sipOverTcpSupport; bool m_sipLogFailedCalls; + bool m_sipUse200OkMediaAddress; bool m_useMacIfNoLocalParty; bool m_skinnyIgnoreStopMediaTransmission; -- cgit v1.2.3