diff options
Diffstat (limited to 'orkaudio')
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/VoIp.cpp | 70 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp | 1 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/VoIpConfig.h | 1 |
3 files changed, 71 insertions, 1 deletions
diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp index ef9c06d..f9124c8 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp @@ -17,6 +17,7 @@ #include "ace/OS_NS_unistd.h" #include "ace/OS_NS_string.h" #include "ace/OS_NS_strings.h" +#include "ace/OS_NS_dirent.h" #include "ace/Singleton.h" #include "ace/Min_Max.h" #include "ace/OS_NS_arpa_inet.h" @@ -234,6 +235,7 @@ bool TrySipInvite(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader char* toField = memFindAfter("To: ", (char*)udpPayload, sipEnd); char* callIdField = memFindAfter("Call-ID: ", (char*)udpPayload, sipEnd); char* audioField = NULL; + char* connectionAddressField = NULL; if(fromField) { @@ -280,13 +282,36 @@ bool TrySipInvite(EthernetHeaderStruct* ethernetHeader, IpHeaderStruct* ipHeader { GrabToken(callIdField, info->m_callId); audioField = memFindAfter("m=audio ", callIdField, sipEnd); + connectionAddressField = memFindAfter("c=IN IP4 ", callIdField, sipEnd); } if(audioField) { GrabToken(audioField, info->m_fromRtpPort); + } + if(connectionAddressField) + { + CStdString connectionAddress; + GrabToken(connectionAddressField, connectionAddress); + struct in_addr fromIp; + if(connectionAddress.size()) + { + if(ACE_OS::inet_aton((PCSTR)connectionAddress, &fromIp)) + { + info->m_fromIp = fromIp; + } + } + } + if(info->m_fromIp.s_addr == 0) + { + // In case connection address could not be extracted, use SIP invite sender IP address info->m_fromIp = ipHeader->ip_src; + } + + if(info->m_fromRtpPort.size() && info->m_from.size() && info->m_to.size() && info->m_callId.size()) + { RtpSessionsSingleton::instance()->ReportSipInvite(info); } + CStdString logMsg; info->ToString(logMsg); logMsg = "INVITE: " + logMsg; @@ -456,6 +481,7 @@ public: private: void OpenDevices(); void OpenPcapFile(CStdString& filename); + void VoIp::OpenPcapDirectory(CStdString& path); pcap_t* m_pcapHandle; std::list<pcap_t*> m_pcapHandles; @@ -489,11 +515,49 @@ void Configure(DOMNode* node) } } +void VoIp::OpenPcapDirectory(CStdString& path) +{ + CStdString logMsg; + + // Iterate over folder + ACE_DIR* dir = ACE_OS::opendir((PCSTR)path); + if (!dir) + { + LOG4CXX_ERROR(s_packetLog, CStdString("pcap traces directory could not be found:" + path + " please correct this in config.xml")); + } + else + { + dirent* dirEntry = NULL; + while(dirEntry = ACE_OS::readdir(dir)) + { + CStdString dirEntryFilename = dirEntry->d_name; + CStdString pcapExtension = ".pcap"; + int extensionPos = dirEntryFilename.Find(pcapExtension); + if(extensionPos == -1) + { + pcapExtension = ".cap"; + extensionPos = dirEntryFilename.Find(pcapExtension); + } + + if ( extensionPos != -1 && (dirEntryFilename.size() - extensionPos) == pcapExtension.size() ) + { + CStdString pcapFilePath = path + "/" + dirEntry->d_name; + if(FileCanOpen(pcapFilePath)) + { + OpenPcapFile(pcapFilePath); + } + } + } + ACE_OS::closedir(dir); + } + +} + void VoIp::OpenPcapFile(CStdString& filename) { CStdString logMsg; - LOG4CXX_INFO(s_packetLog, CStdString("Replaying pcap capture file:") + filename); + LOG4CXX_INFO(s_packetLog, CStdString("Adding pcap capture file to replay list:") + filename); // Open device char * error = NULL; @@ -629,6 +693,10 @@ void VoIp::Initialize() LOG4CXX_ERROR(s_packetLog, "Could not open pcap file: " + DLLCONFIG.m_pcapFile); } } + else if(DLLCONFIG.m_pcapDirectory.size() > 0) + { + OpenPcapDirectory(DLLCONFIG.m_pcapDirectory); + } else { OpenDevices(); diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp index db0831a..7cb6dde 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp @@ -33,6 +33,7 @@ void VoIpConfig::Define(Serializer* s) s->CsvValue("LanMasks", m_asciiLanMasks); s->CsvValue("MediaGateways", m_asciiMediaGateways); s->StringValue("PcapFile", m_pcapFile); + s->StringValue("PcapDirectory", m_pcapDirectory); } void VoIpConfig::Validate() diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h index 260acf4..4a9ce83 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h @@ -44,6 +44,7 @@ public: std::list<unsigned int> m_lanMasks; std::list<CStdString> m_asciiLanMasks; CStdString m_pcapFile; + CStdString m_pcapDirectory; }; //======================================== |