]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
bypass: bytes and pkts counters for local bypass
authorEric Leblond <eric@regit.org>
Mon, 10 Jun 2019 20:48:10 +0000 (22:48 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 18 Jun 2019 05:07:02 +0000 (07:07 +0200)
src/flow-worker.c

index 31de2d989d4ff53e490dace9345640a5e1f9cf52..33ec726b95a91fff4d285de30b11461d2501428d 100644 (file)
@@ -59,6 +59,9 @@ typedef struct FlowWorkerThreadData_ {
 
     void *output_thread; /* Output thread data. */
 
+    uint16_t local_bypass_pkts;
+    uint16_t local_bypass_bytes;
+
     PacketQueue pq;
 
 } FlowWorkerThreadData;
@@ -67,14 +70,17 @@ typedef struct FlowWorkerThreadData_ {
  *
  *  Handle flow creation/lookup
  */
-static inline TmEcode FlowUpdate(Packet *p)
+static inline TmEcode FlowUpdate(ThreadVars *tv, FlowWorkerThreadData *fw, Packet *p)
 {
     FlowHandlePacketUpdate(p->flow, p);
 
     int state = SC_ATOMIC_GET(p->flow->flow_state);
     switch (state) {
         case FLOW_STATE_CAPTURE_BYPASSED:
+            return TM_ECODE_DONE;
         case FLOW_STATE_LOCAL_BYPASSED:
+            StatsAddUI64(tv, fw->local_bypass_pkts, 1);
+            StatsAddUI64(tv, fw->local_bypass_bytes, GET_PKT_LEN(p));
             return TM_ECODE_DONE;
         default:
             return TM_ECODE_OK;
@@ -92,6 +98,9 @@ static TmEcode FlowWorkerThreadInit(ThreadVars *tv, const void *initdata, void *
     SC_ATOMIC_INIT(fw->detect_thread);
     SC_ATOMIC_SET(fw->detect_thread, NULL);
 
+    fw->local_bypass_pkts = StatsRegisterCounter("flow_bypassed.local_pkts", tv);
+    fw->local_bypass_bytes = StatsRegisterCounter("flow_bypassed.local_bytes", tv);
+
     fw->dtv = DecodeThreadVarsAlloc(tv);
     if (fw->dtv == NULL) {
         FlowWorkerThreadDeinit(tv, fw);
@@ -181,7 +190,7 @@ static TmEcode FlowWorker(ThreadVars *tv, Packet *p, void *data, PacketQueue *pr
         FlowHandlePacket(tv, fw->dtv, p);
         if (likely(p->flow != NULL)) {
             DEBUG_ASSERT_FLOW_LOCKED(p->flow);
-            if (FlowUpdate(p) == TM_ECODE_DONE) {
+            if (FlowUpdate(tv, fw, p) == TM_ECODE_DONE) {
                 FLOWLOCK_UNLOCK(p->flow);
                 return TM_ECODE_OK;
             }