From 382308244b4fbc06e16950c811129b2c4dfd637f Mon Sep 17 00:00:00 2001 From: Henri Herscher Date: Thu, 18 May 2006 20:57:54 +0000 Subject: Added pcap replay repeat capability. git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@239 09dcff7a-b715-0410-9601-b79a96267cd0 --- orkaudio/audiocaptureplugins/voip/VoIp.cpp | 60 ++++++++++++++++-------- orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp | 2 + orkaudio/audiocaptureplugins/voip/VoIpConfig.h | 1 + 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp index 103336f..1fa8755 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp @@ -49,6 +49,7 @@ static LoggerPtr s_voipPluginLog; static time_t s_lastHooveringTime; static ACE_Thread_Mutex s_mutex; static ACE_Thread_Semaphore s_replaySemaphore; +int s_replayThreadCounter; static bool s_liveCapture; VoIpConfigTopObjectRef g_VoIpConfigTopObjectRef; @@ -56,6 +57,28 @@ VoIpConfigTopObjectRef g_VoIpConfigTopObjectRef; #define PROMISCUOUS 1 +//======================================================== +class VoIp +{ +public: + VoIp(); + void Initialize(); + void Run(); + void Shutdown(); + void StartCapture(CStdString& port); + void StopCapture(CStdString& port); +private: + void OpenDevices(); + void OpenPcapFile(CStdString& filename); + void VoIp::OpenPcapDirectory(CStdString& path); + + pcap_t* m_pcapHandle; + std::list m_pcapHandles; +}; + +typedef ACE_Singleton VoIpSingleton; + +//========================================================= // Convert a piece of memory to hex string void memToHex(unsigned char* input, size_t len, CStdString&output) { @@ -526,13 +549,18 @@ void HandlePacket(u_char *param, const struct pcap_pkthdr *header, const u_char } } - void SingleDeviceCaptureThreadHandler(pcap_t* pcapHandle) { + bool repeat = false; if(!s_liveCapture) { // File replay, make sure that only one file is replayed at a time s_replaySemaphore.acquire(); + s_replayThreadCounter--; + if(s_replayThreadCounter == 0 && DLLCONFIG.m_pcapRepeat) + { + repeat = true; + } } if(pcapHandle) { @@ -557,28 +585,16 @@ void SingleDeviceCaptureThreadHandler(pcap_t* pcapHandle) // Pass token to for next file replay s_replaySemaphore.release(); } + if(repeat == true) + { + // Reinitialize for another file replay cycle. + VoIpSingleton::instance()->Initialize(); + VoIpSingleton::instance()->Run(); + } } -class VoIp -{ -public: - VoIp(); - void Initialize(); - void Run(); - void Shutdown(); - void StartCapture(CStdString& port); - void StopCapture(CStdString& port); -private: - void OpenDevices(); - void OpenPcapFile(CStdString& filename); - void VoIp::OpenPcapDirectory(CStdString& path); - - pcap_t* m_pcapHandle; - std::list m_pcapHandles; -}; - -typedef ACE_Singleton VoIpSingleton; +//======================================================= VoIp::VoIp() { m_pcapHandle = NULL; @@ -796,8 +812,11 @@ void VoIp::Initialize() } } + void VoIp::Run() { + s_replayThreadCounter = m_pcapHandles.size(); + for(std::list::iterator it = m_pcapHandles.begin(); it != m_pcapHandles.end(); it++) { if (!ACE_Thread_Manager::instance()->spawn(ACE_THR_FUNC(SingleDeviceCaptureThreadHandler), *it)) @@ -825,6 +844,7 @@ void VoIp::StopCapture(CStdString& port) ; } + void __CDECL__ Initialize() { VoIpSingleton::instance()->Initialize(); diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp index 5a12214..9863b5a 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp @@ -26,6 +26,7 @@ VoIpConfig::VoIpConfig() m_asciiLanMasks.push_back("172.31.255.255"); m_sipDropIndirectInvite = false; + m_pcapRepeat = false; } void VoIpConfig::Define(Serializer* s) @@ -40,6 +41,7 @@ void VoIpConfig::Define(Serializer* s) s->StringValue("PcapFile", m_pcapFile); s->StringValue("PcapDirectory", m_pcapDirectory); + s->BoolValue("PcapRepeat", m_pcapRepeat); s->BoolValue("SipDropIndirectInvite", m_sipDropIndirectInvite); } diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h index 5313389..751d339 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h @@ -55,6 +55,7 @@ public: CStdString m_pcapFile; CStdString m_pcapDirectory; + bool m_pcapRepeat; bool m_sipDropIndirectInvite; }; -- cgit v1.2.3