summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2006-05-18 20:57:54 +0000
committerHenri Herscher <henri@oreka.org>2006-05-18 20:57:54 +0000
commit382308244b4fbc06e16950c811129b2c4dfd637f (patch)
tree1562305d745c38bbd5392cbb2ff14c85fe89d70c
parenteeb70797cfcafb081dc758d17871e77ec0784037 (diff)
Added pcap replay repeat capability.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@239 09dcff7a-b715-0410-9601-b79a96267cd0
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIp.cpp60
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp2
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIpConfig.h1
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<pcap_t*> m_pcapHandles;
+};
+
+typedef ACE_Singleton<VoIp, ACE_Thread_Mutex> 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<pcap_t*> m_pcapHandles;
-};
-
-typedef ACE_Singleton<VoIp, ACE_Thread_Mutex> VoIpSingleton;
+//=======================================================
VoIp::VoIp()
{
m_pcapHandle = NULL;
@@ -796,8 +812,11 @@ void VoIp::Initialize()
}
}
+
void VoIp::Run()
{
+ s_replayThreadCounter = m_pcapHandles.size();
+
for(std::list<pcap_t*>::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;
};