]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
stream: add insert failure counters
authorVictor Julien <victor@inliniac.net>
Wed, 8 Mar 2017 11:50:32 +0000 (12:50 +0100)
committerVictor Julien <victor@inliniac.net>
Thu, 20 Apr 2017 15:41:11 +0000 (17:41 +0200)
src/stream-tcp-list.c
src/stream-tcp-reassemble.h
src/stream-tcp.c

index e3327763ac6916215ed1db391c3d2c1ab40c9450..95f3dbc16f765e56897edba8a7b549f25bf79613 100644 (file)
@@ -538,13 +538,18 @@ static int DoHandleData(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx,
 int StreamTcpReassembleInsertSegment(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx,
         TcpStream *stream, TcpSegment *seg, Packet *p, uint32_t pkt_seq, uint8_t *pkt_data, uint16_t pkt_datalen)
 {
-    /* insert segment into list. Note: doesn't handle the data */
 #ifdef DEBUG
     SCLogDebug("pre insert");
     PrintList(stream->seg_list);
 #endif
 
+    /* insert segment into list. Note: doesn't handle the data */
     int r = DoInsertSegment (stream, seg, p);
+    if (r < 0) {
+        StatsIncr(tv, ra_ctx->counter_tcp_reass_list_fail);
+        StreamTcpSegmentReturntoPool(seg);
+        SCReturnInt(-1);
+    }
 
 #ifdef DEBUG
     SCLogDebug("post insert");
@@ -555,6 +560,7 @@ int StreamTcpReassembleInsertSegment(ThreadVars *tv, TcpReassemblyThreadCtx *ra_
         /* no overlap, straight data insert */
         int res = InsertSegmentDataCustom(stream, seg, pkt_data, pkt_datalen);
         if (res < 0) {
+            StatsIncr(tv, ra_ctx->counter_tcp_reass_data_normal_fail);
             StreamTcpRemoveSegmentFromStream(stream, seg);
             StreamTcpSegmentReturntoPool(seg);
             SCReturnInt(-1);
@@ -567,14 +573,11 @@ int StreamTcpReassembleInsertSegment(ThreadVars *tv, TcpReassemblyThreadCtx *ra_
         /* now let's consider the data in the overlap case */
         int res = DoHandleData(tv, ra_ctx, stream, seg, p);
         if (res < 0) {
+            StatsIncr(tv, ra_ctx->counter_tcp_reass_data_overlap_fail);
             StreamTcpRemoveSegmentFromStream(stream, seg);
             StreamTcpSegmentReturntoPool(seg);
             SCReturnInt(-1);
         }
-
-    } else if (r < 0) {
-        StreamTcpSegmentReturntoPool(seg);
-        SCReturnInt(-1);
     }
 
     SCReturnInt(0);
index 3162ca7132e76149dfc0fa4eaa857727952660a0..9471e4d04e6a348f25de121b43585db4402f3b28 100644 (file)
@@ -64,6 +64,10 @@ typedef struct TcpReassemblyThreadCtx_ {
     uint16_t counter_tcp_reass_overlap;
     /** count overlaps with different data */
     uint16_t counter_tcp_reass_overlap_diff_data;
+
+    uint16_t counter_tcp_reass_data_normal_fail;
+    uint16_t counter_tcp_reass_data_overlap_fail;
+    uint16_t counter_tcp_reass_list_fail;
 } TcpReassemblyThreadCtx;
 
 #define OS_POLICY_DEFAULT   OS_POLICY_BSD
index b77975cd4df442fa43baf2504ac1407acae57c0e..e0ce65073ef52f68ce56ecd7b10194a299ae9e6e 100644 (file)
@@ -4957,6 +4957,11 @@ TmEcode StreamTcpThreadInit(ThreadVars *tv, void *initdata, void **data)
     stt->ra_ctx->counter_tcp_reass_overlap = StatsRegisterCounter("tcp.overlap", tv);
     stt->ra_ctx->counter_tcp_reass_overlap_diff_data = StatsRegisterCounter("tcp.overlap_diff_data", tv);
 
+    stt->ra_ctx->counter_tcp_reass_data_normal_fail = StatsRegisterCounter("tcp.insert_data_normal_fail", tv);
+    stt->ra_ctx->counter_tcp_reass_data_overlap_fail = StatsRegisterCounter("tcp.insert_data_overlap_fail", tv);
+    stt->ra_ctx->counter_tcp_reass_list_fail = StatsRegisterCounter("tcp.insert_list_fail", tv);
+
+
     SCLogDebug("StreamTcp thread specific ctx online at %p, reassembly ctx %p",
                 stt, stt->ra_ctx);