]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/capture/divert_freebsd/divert_cap.cpp
Fix fee charge rules with non-zero credit
[stg.git] / projects / stargazer / plugins / capture / divert_freebsd / divert_cap.cpp
index a76629fbca35711aef5edb6c80b86f330ccf63bb..60672048a6ce00e3e6ad243526d3f14878a45898 100644 (file)
 $Revision: 1.13 $
 $Date: 2010/09/10 06:43:03 $
 */
-#include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
-#include <string.h>
 
 #include <sys/uio.h>
 #include <sys/time.h>
 #include <sys/ioctl.h>
 #include <sys/poll.h>
 
-#include <errno.h>
 #include <fcntl.h>
-#include <stdlib.h>
-#include <signal.h>
 #include <unistd.h>
 
-#include "common.h"
+#include <cstdio>
+#include <cstring>
+#include <cerrno>
+#include <cstdlib>
+#include <csignal>
+
+#include <algorithm>
+#include <vector>
+
+#include "stg/common.h"
+#include "stg/traffcounter.h"
+#include "stg/plugin_creator.h"
 #include "divert_cap.h"
 
 #define BUFF_LEN (16384) /* max mtu -> lo=16436  TODO why?*/
 
 //-----------------------------------------------------------------------------
-struct DIVERT_DATA
-{
+struct DIVERT_DATA {
 int sock;
 short int port;
 unsigned char buffer[BUFF_LEN];
@@ -56,59 +61,33 @@ char iface[10];
 pollfd pollddiv;
 DIVERT_DATA cddiv;  //capture data
 //-----------------------------------------------------------------------------
-class DIVERT_CAP_CREATOR
-{
-private:
-    DIVERT_CAP * divc;
-
-public:
-    DIVERT_CAP_CREATOR()
-        : divc(new DIVERT_CAP())
-        {
-        };
-    ~DIVERT_CAP_CREATOR()
-        {
-        delete divc;
-        };
-
-    DIVERT_CAP * GetCapturer()
-    {
-    return divc;
-    };
-};
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
+PLUGIN_CREATOR<DIVERT_CAP> dcc;
 //-----------------------------------------------------------------------------
-DIVERT_CAP_CREATOR dcc;
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-BASE_PLUGIN * GetPlugin()
+PLUGIN * GetPlugin()
 {
-return dcc.GetCapturer();
+return dcc.GetPlugin();
 }
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-const string DIVERT_CAP::GetVersion() const
+const std::string DIVERT_CAP::GetVersion() const
 {
 return "Divert_cap v.1.0";
 }
 //-----------------------------------------------------------------------------
 DIVERT_CAP::DIVERT_CAP()
+    : settings(),
+      port(0),
+      errorStr(),
+      thread(),
+      nonstop(false),
+      isRunning(false),
+      traffCnt(NULL)
 {
-isRunning = false;
-nonstop = false;
-}
-//-----------------------------------------------------------------------------
-void DIVERT_CAP::SetTraffcounter(TRAFFCOUNTER * tc)
-{
-traffCnt = tc;
-}
-//-----------------------------------------------------------------------------
-const string & DIVERT_CAP::GetStrError() const
-{
-return errorStr;
 }
 //-----------------------------------------------------------------------------
 int DIVERT_CAP::Start()
@@ -151,7 +130,8 @@ for (i = 0; i < 25; i++)
     if (!isRunning)
         break;
 
-    usleep(200000);
+    struct timespec ts = {0, 200000000};
+    nanosleep(&ts, NULL);
     }
 
 //after 5 seconds waiting thread still running. now killing it
@@ -168,51 +148,26 @@ if (isRunning)
 return 0;
 }
 //-----------------------------------------------------------------------------
-bool DIVERT_CAP::IsRunning()
-{
-return isRunning;
-}
-//-----------------------------------------------------------------------------
 void * DIVERT_CAP::Run(void * d)
 {
-DIVERT_CAP * dc = (DIVERT_CAP *)d;
-dc->isRunning = true;
-
-/*struct ETH_IP
-{
-uint16_t    ethHdr[8];
-RAW_PACKET  rp;
-char        padding[4];
-char        padding1[8];
-};
-
-ETH_IP * ethIP;
+sigset_t signalSet;
+sigfillset(&signalSet);
+pthread_sigmask(SIG_BLOCK, &signalSet, NULL);
 
-char ethip[sizeof(ETH_IP)];
-
-//memset(&ethIP, 0, sizeof(ethIP));
-memset(&ethip, 0, sizeof(ETH_IP));
+DIVERT_CAP * dc = static_cast<DIVERT_CAP *>(d);
+dc->isRunning = true;
 
-ethIP = (ETH_IP *)&ethip;
-ethIP->rp.dataLen = -1;
-*/
-//char * iface = NULL;
 char buffer[64];
 while (dc->nonstop)
     {
     RAW_PACKET rp;
     dc->DivertCapRead(buffer, 64, NULL);
 
-    //printf("%x %x %x %x \n", buffer[0], buffer[4], buffer[8], buffer[12]);
-    //printf("%x %x %x %x \n", buffer[16], buffer[20], buffer[24], buffer[28]);
-    //printf("%x %x %x %x \n", buffer[32], buffer[36], buffer[40], buffer[44]);
-
     if (buffer[12] != 0x8)
         continue;
 
-    memcpy(rp.pckt, &buffer[14], pcktSize);
+    memcpy(rp.rawPacket.pckt, &buffer[14], pcktSize);
 
-    //dc->traffCnt->Process(*((RAW_PACKET*)( &buffer[14] ))); // - too dirty!
     dc->traffCnt->Process(rp);
     }
 
@@ -220,22 +175,6 @@ dc->isRunning = false;
 return NULL;
 }
 //-----------------------------------------------------------------------------
-uint16_t DIVERT_CAP::GetStartPosition() const
-{
-return 10;
-}
-//-----------------------------------------------------------------------------
-uint16_t DIVERT_CAP::GetStopPosition() const
-{
-return 10;
-}
-//-----------------------------------------------------------------------------
-/*****************************************************************************/
-/*****************************************************************************/
-/*****************************************************************************/
-/*****************************************************************************/
-/*****************************************************************************/
-//-----------------------------------------------------------------------------
 int DIVERT_CAP::DivertCapOpen()
 {
 memset(&pollddiv, 0, sizeof(pollddiv));
@@ -328,10 +267,10 @@ int DIVERT_CAP::ParseSettings()
 {
 int p;
 PARAM_VALUE pv;
-vector<PARAM_VALUE>::const_iterator pvi;
+std::vector<PARAM_VALUE>::const_iterator pvi;
 
 pv.param = "Port";
-pvi = find(settings.moduleParams.begin(), settings.moduleParams.end(), pv);
+pvi = std::find(settings.moduleParams.begin(), settings.moduleParams.end(), pv);
 if (pvi == settings.moduleParams.end())
     {
     port = 15701;
@@ -350,24 +289,3 @@ port = p;
 return 0;
 }
 //-----------------------------------------------------------------------------
-int DIVERT_CAP::ParseIntInRange(const string & str, int min, int max, int * val)
-{
-if (str2x(str.c_str(), *val))
-    {
-    errorStr = "Incorrect value \'" + str + "\'.";
-    return -1;
-    }
-if (*val < min || *val > max)
-    {
-    errorStr = "Value \'" + str + "\' out of range.";
-    return -1;
-    }
-return 0;
-}
-//-----------------------------------------------------------------------------
-void DIVERT_CAP::SetSettings(const MODULE_SETTINGS & s)
-{
-settings = s;
-}
-//-----------------------------------------------------------------------------
-