diff options
Diffstat (limited to 'orkaudio/audiocaptureplugins')
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h | 2 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/RtpSession.cpp | 89 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/RtpSession.h | 22 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/VoIp.cpp | 206 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp | 2 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/VoIpConfig.h | 1 |
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; |