From a019fc0e9e62ef7bed966a59ee2b2e81f72dce86 Mon Sep 17 00:00:00 2001 From: Gerald Begumisa Date: Wed, 2 Sep 2009 07:37:59 +0000 Subject: Adjusted recording strategy for Asterisk-DAHDI channels, to now obtain the remote party from the SIP BYE, as opposed to the INVITE as was originally the case. git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@639 09dcff7a-b715-0410-9601-b79a96267cd0 --- orkaudio/audiocaptureplugins/voip/RtpSession.cpp | 136 ++++++++++++----------- orkaudio/audiocaptureplugins/voip/RtpSession.h | 11 +- orkaudio/audiocaptureplugins/voip/VoIp.cpp | 99 +++++++++++++++-- orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp | 1 + 4 files changed, 172 insertions(+), 75 deletions(-) diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp index 3ac52f1..d60223c 100644 --- a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp +++ b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp @@ -1141,88 +1141,90 @@ bool RtpSession::AddRtpPacket(RtpPacketInfoRef& rtpPacket) return true; } - -void RtpSession::ReportSipInvite(SipInviteInfoRef& invite) +void RtpSession::ReportSipBye(SipByeInfoRef& bye) { - if(m_invite.get() == NULL) - { - m_invite = invite; - m_invitorIp = invite->m_fromRtpIp; - memcpy(m_invitorMac, invite->m_senderMac, sizeof(m_invitorMac)); - } - else + CStdString byeString; + CStdString logMsg; + + bye->ToString(byeString); + if(DLLCONFIG.m_dahdiIntercept == true) { - CStdString inviteString; - CStdString logMsg; - invite->ToString(inviteString); + // With Xorcom interception, we update whichever party is currently + // set to "s" with the new party in either m_from or m_to of the + // BYE - if(DLLCONFIG.m_dahdiIntercept == true) + if(m_localParty.CompareNoCase(CStdString("s")) == 0) { - // With Xorcom interception, we update whichever party is currently - // set to "s" with the new party in either m_from or m_to of the - // INVITE - - if(m_localParty.CompareNoCase(CStdString("s")) == 0) + if(m_remoteParty.CompareNoCase(bye->m_to) != 0) { - if(m_remoteParty.CompareNoCase(invite->m_to) != 0) - { - // remoteparty is set to m_from - m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_to); - logMsg.Format("[%s] dahdiIntercept: reset localparty:%s from INVITE:%s", m_trackingId, m_localParty, inviteString); - } - else - { - // remoteparty is set to m_to - m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_from); - logMsg.Format("[%s] dahdiIntercept: reset localparty:%s from INVITE:%s", m_trackingId, m_localParty, inviteString); - } - - // Report Local party - CaptureEventRef event(new CaptureEvent()); - event->m_type = CaptureEvent::EtLocalParty; - event->m_value = m_localParty; - g_captureEventCallBack(event, m_capturePort); + // remoteparty is set to m_from + m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_to); + logMsg.Format("[%s] dahdiIntercept: reset localparty:%s from BYE:%s", m_trackingId, m_localParty, byeString); } - else if(m_remoteParty.CompareNoCase(CStdString("s")) == 0) + else { - CStdString translatedTo, translatedFrom; + // remoteparty is set to m_to + m_localParty = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_from); + logMsg.Format("[%s] dahdiIntercept: reset localparty:%s from BYE:%s", m_trackingId, m_localParty, byeString); + } - translatedTo = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_to); - translatedFrom = RtpSessionsSingleton::instance()->GetLocalPartyMap(invite->m_from); + // Report Local party + CaptureEventRef event(new CaptureEvent()); + event->m_type = CaptureEvent::EtLocalParty; + event->m_value = m_localParty; + g_captureEventCallBack(event, m_capturePort); + } + else if(m_remoteParty.CompareNoCase(CStdString("s")) == 0) + { + CStdString translatedTo, translatedFrom; - if(m_localParty.CompareNoCase(translatedTo) != 0) - { - // localparty is set to m_from - m_remoteParty = invite->m_to; - logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from INVITE:%s", m_trackingId, m_remoteParty, inviteString); - } - else - { - // localparty is set to m_to - m_remoteParty = invite->m_from; - logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from INVITE:%s", m_trackingId, m_remoteParty, inviteString); - } + translatedTo = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_to); + translatedFrom = RtpSessionsSingleton::instance()->GetLocalPartyMap(bye->m_from); - // Report remote party - CaptureEventRef event(new CaptureEvent()); - event->m_type = CaptureEvent::EtRemoteParty; - event->m_value = m_remoteParty; - g_captureEventCallBack(event, m_capturePort); + if(m_localParty.CompareNoCase(translatedTo) != 0) + { + // localparty is set to m_from + m_remoteParty = bye->m_to; + logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from BYE:%s", m_trackingId, m_remoteParty, byeString); } else { - logMsg.Format("[%s] dahdiIntercept: ignoring INVITE:%s", m_trackingId, inviteString); + // localparty is set to m_to + m_remoteParty = bye->m_from; + logMsg.Format("[%s] dahdiIntercept: reset remoteparty:%s from BYE:%s", m_trackingId, m_remoteParty, byeString); } - LOG4CXX_INFO(m_log, logMsg); - - return; + // Report remote party + CaptureEventRef event(new CaptureEvent()); + event->m_type = CaptureEvent::EtRemoteParty; + event->m_value = m_remoteParty; + g_captureEventCallBack(event, m_capturePort); } else { - logMsg.Format("[%s] associating INVITE:%s", m_trackingId, inviteString); - LOG4CXX_INFO(m_log, logMsg); + logMsg.Format("[%s] dahdiIntercept: ignoring BYE:%s", m_trackingId, byeString); } + + LOG4CXX_INFO(m_log, logMsg); + } +} + +void RtpSession::ReportSipInvite(SipInviteInfoRef& invite) +{ + if(m_invite.get() == NULL) + { + m_invite = invite; + m_invitorIp = invite->m_fromRtpIp; + memcpy(m_invitorMac, invite->m_senderMac, sizeof(m_invitorMac)); + } + else + { + CStdString inviteString; + CStdString logMsg; + invite->ToString(inviteString); + + logMsg.Format("[%s] associating INVITE:%s", m_trackingId, inviteString); + LOG4CXX_INFO(m_log, logMsg); } m_invites.push_front(invite); if(invite->m_telephoneEventPtDefined) @@ -1610,15 +1612,17 @@ void RtpSessions::ReportSip200Ok(Sip200OkInfoRef info) //} } -void RtpSessions::ReportSipBye(SipByeInfo bye) +void RtpSessions::ReportSipBye(SipByeInfoRef& bye) { std::map::iterator pair; - pair = m_byCallId.find(bye.m_callId); + pair = m_byCallId.find(bye->m_callId); if (pair != m_byCallId.end()) { // Session found: stop it RtpSessionRef session = pair->second; + + session->ReportSipBye(bye); Stop(session); } } @@ -3145,6 +3149,6 @@ void SipByeInfo::ToString(CStdString& string) char receiverIp[16]; ACE_OS::inet_ntop(AF_INET, (void*)&m_receiverIp, receiverIp, sizeof(receiverIp)); - string.Format("sender:%s rcvr:%s callid:%s", senderIp, receiverIp, m_callId); + string.Format("sender:%s rcvr:%s callid:%s from:%s to:%s fromDomain:%s toDomain:%s fromName:%s toName:%s", senderIp, receiverIp, m_callId, m_from, m_to, m_fromDomain, m_toDomain, m_fromName, m_toName); } diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.h b/orkaudio/audiocaptureplugins/voip/RtpSession.h index 792156c..0d88d77 100644 --- a/orkaudio/audiocaptureplugins/voip/RtpSession.h +++ b/orkaudio/audiocaptureplugins/voip/RtpSession.h @@ -82,8 +82,14 @@ public: CStdString m_callId; struct in_addr m_senderIp; struct in_addr m_receiverIp; + CStdString m_from; + CStdString m_to; + CStdString m_fromDomain; + CStdString m_toDomain; + CStdString m_fromName; + CStdString m_toName; }; - +typedef boost::shared_ptr SipByeInfoRef; class Sip200OkInfo { @@ -148,6 +154,7 @@ public: void Stop(); void Start(); bool AddRtpPacket(RtpPacketInfoRef& rtpPacket); + void ReportSipBye(SipByeInfoRef& bye); void ReportSipInvite(SipInviteInfoRef& invite); void ReportSipErrorPacket(SipFailureMessageInfoRef& info); void ReportRtcpSrcDescription(RtcpSrcDescriptionPacketInfoRef& rtcpInfo); @@ -252,7 +259,7 @@ public: void Stop(RtpSessionRef& session); void StopAll(); void ReportSipInvite(SipInviteInfoRef& invite); - void ReportSipBye(SipByeInfo bye); + void ReportSipBye(SipByeInfoRef& bye); void ReportSkinnyCallInfo(SkCallInfoStruct*, IpHeaderStruct* ipHeader); void ReportSkinnyStartMediaTransmission(SkStartMediaTransmissionStruct*, IpHeaderStruct* ipHeader); void ReportSkinnyStopMediaTransmission(SkStopMediaTransmissionStruct*, IpHeaderStruct* ipHeader); diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp index 97671d0..c88dda7 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp @@ -1467,23 +1467,108 @@ bool TrySipBye(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader, U result = true; int sipLength = ntohs(udpHeader->len); char* sipEnd = (char*)udpPayload + sipLength; - SipByeInfo info; - char* callIdField = memFindAfter("Call-ID:", (char*)udpPayload, sipEnd); + SipByeInfoRef info(new SipByeInfo()); + + 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); } - if(callIdField) { - GrabTokenSkipLeadingWhitespaces(callIdField, sipEnd, info.m_callId); + GrabTokenSkipLeadingWhitespaces(callIdField, sipEnd, info->m_callId); } - info.m_senderIp = ipHeader->ip_src; - info.m_receiverIp = ipHeader->ip_dest; + + 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); + } + } + + info->m_senderIp = ipHeader->ip_src; + info->m_receiverIp = ipHeader->ip_dest; CStdString logMsg; - info.ToString(logMsg); + info->ToString(logMsg); LOG4CXX_INFO(s_sipPacketLog, "BYE: " + logMsg); if(callIdField && DLLCONFIG.m_sipIgnoreBye == false) { diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp index e9d5a8a..03dea4f 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp @@ -389,6 +389,7 @@ void VoIpConfig::Validate() m_sipAllowMultipleMediaAddresses = true; m_rtpDetectOnOddPorts = true; m_sipRequestUriAsLocalParty = false; + m_sipIgnoreBye = false; } } -- cgit v1.2.3