]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
stream: reduce space used for progress tracking
authorVictor Julien <victor@inliniac.net>
Wed, 27 Apr 2016 20:13:27 +0000 (22:13 +0200)
committerVictor Julien <victor@inliniac.net>
Thu, 20 Apr 2017 15:41:11 +0000 (17:41 +0200)
Instead of the explicit base_seq_offset, use a macro instead. The
macro points to the stream buffer offset. The two were always
in sync.

src/stream-tcp-list.c
src/stream-tcp-private.h
src/stream-tcp-reassemble.c

index ba0fd6ce2b645e4f00214997c1c23b99936aa35c..6007bae85e2f8dde02d510d0f54281b7e0ee5bb1 100644 (file)
@@ -58,12 +58,12 @@ static inline int InsertSegmentDataCustom(TcpStream *stream, TcpSegment *seg, ui
     uint16_t data_offset;
 
     if (likely(SEQ_GEQ(seg->seq, stream->base_seq))) {
-        stream_offset = stream->base_seq_offset + (seg->seq - stream->base_seq);
+        stream_offset = STREAM_BASE_OFFSET(stream) + (seg->seq - stream->base_seq);
         data_offset = 0;
     } else {
         /* segment is partly before base_seq */
         data_offset = stream->base_seq - seg->seq;
-        stream_offset = stream->base_seq_offset;
+        stream_offset = STREAM_BASE_OFFSET(stream);
     }
 
     SCLogDebug("stream %p buffer %p, stream_offset %"PRIu64", "
@@ -727,14 +727,13 @@ void StreamTcpPruneSession(Flow *f, uint8_t flags)
             }
         }
 
-        if (left_edge > stream->base_seq_offset) {
-            uint32_t slide = left_edge - stream->base_seq_offset;
+        if (left_edge > STREAM_BASE_OFFSET(stream)) {
+            uint32_t slide = left_edge - STREAM_BASE_OFFSET(stream);
             SCLogDebug("buffer sliding %u to offset %"PRIu64, slide, left_edge);
             StreamingBufferSlideToOffset(stream->sb, left_edge);
-            stream->base_seq_offset += slide;
             stream->base_seq += slide;
             SCLogDebug("stream base_seq %u at stream offset %"PRIu64,
-                    stream->base_seq, stream->base_seq_offset);
+                    stream->base_seq, STREAM_BASE_OFFSET(stream));
         }
     }
 
index 773e74d7d5d29fedcb724e0161ae704b99f0caeb..448efba5eed58a952a97a8dab59b46d239a81628 100644 (file)
@@ -85,9 +85,8 @@ typedef struct TcpStream_ {
                                          This will be used to validate the last_ts, when connection has been idle for
                                          longer time.(RFC 1323)*/
     /* reassembly */
-    uint32_t base_seq;              /**< seq where we are left with reassebly */
-    uint64_t base_seq_offset;       /**< offset from the start of the stream (== 0) of the current
-                                     *   base seq */
+    uint32_t base_seq;              /**< seq where we are left with reassebly. Matches STREAM_BASE_OFFSET below. */
+
     StreamingBuffer *sb;
     uint64_t app_progress;
     uint64_t raw_progress;
@@ -99,6 +98,8 @@ typedef struct TcpStream_ {
     StreamTcpSackRecord *sack_tail; /**< tail of list of SACK records */
 } TcpStream;
 
+#define STREAM_BASE_OFFSET(stream)  ((stream)->sb ? (stream)->sb->stream_offset : 0)
+
 /* from /usr/include/netinet/tcp.h */
 enum
 {
index bd1dfab391b280588fb3d4785899d2f46f8774af..979893d3c36e957c443c03b4f6e2125ef2d31e7d 100644 (file)
@@ -264,7 +264,7 @@ void StreamTcpReturnStreamSegments (TcpStream *stream)
 static inline bool STREAM_LASTACK_GT_BASESEQ(const TcpStream *stream)
 {
     /* last ack not yet initialized */
-    if (stream->base_seq_offset == 0 && stream->last_ack == 0)
+    if (STREAM_BASE_OFFSET(stream) == 0 && stream->last_ack == 0)
         return false;
     if (SEQ_GT(stream->last_ack, stream->base_seq))
         return true;
@@ -651,9 +651,9 @@ static uint32_t StreamTcpReassembleCheckDepth(TcpSession *ssn, TcpStream *stream
             SCReturnUInt(0);
         }
 
-        seg_depth = stream->base_seq_offset + size - (stream->base_seq - seq);
+        seg_depth = STREAM_BASE_OFFSET(stream) + size - (stream->base_seq - seq);
     } else {
-        seg_depth = stream->base_seq_offset + ((seq + size) - stream->base_seq);
+        seg_depth = STREAM_BASE_OFFSET(stream) + ((seq + size) - stream->base_seq);
     }
 
     /* if the base_seq has moved passed the depth window we stop
@@ -912,7 +912,7 @@ static int StreamTcpReassembleRawCheckLimit(TcpSession *ssn, TcpStream *stream,
 
         uint32_t delta = stream->last_ack - stream->base_seq;
         /* get max absolute offset */
-        uint64_t max_offset = stream->base_seq_offset + delta;
+        uint64_t max_offset = STREAM_BASE_OFFSET(stream) + delta;
 
         int64_t diff = max_offset - stream->raw_progress;
 
@@ -931,7 +931,7 @@ static int StreamTcpReassembleRawCheckLimit(TcpSession *ssn, TcpStream *stream,
 
         uint32_t delta = stream->last_ack - stream->base_seq;
         /* get max absolute offset */
-        uint64_t max_offset = stream->base_seq_offset + delta;
+        uint64_t max_offset = STREAM_BASE_OFFSET(stream) + delta;
 
         int64_t diff = max_offset - stream->raw_progress;
 
@@ -1357,7 +1357,7 @@ static int ReassembleRaw(TcpSession *ssn, TcpStream *stream, Packet *p)
     SCLogDebug("last_ack %u, base_seq %u", stream->last_ack, stream->base_seq);
     uint32_t delta = stream->last_ack - stream->base_seq;
     /* get max absolute offset */
-    last_ack_abs = stream->base_seq_offset + delta;
+    last_ack_abs = STREAM_BASE_OFFSET(stream) + delta;
     right_edge_abs = last_ack_abs;
 
     if (StreamTcpInlineMode() == TRUE) {
@@ -1366,7 +1366,7 @@ static int ReassembleRaw(TcpSession *ssn, TcpStream *stream, Packet *p)
             stream_config.reassembly_toclient_chunk_size;
         SCLogDebug("pkt SEQ %u, payload_len %u; base_seq %u => base_seq_offset %"PRIu64,
                 TCP_GET_SEQ(p), p->payload_len,
-                stream->base_seq, stream->base_seq_offset);
+                stream->base_seq, STREAM_BASE_OFFSET(stream));
 
         SCLogDebug("progress before adjust %"PRIu64", chunk_size %"PRIu32, progress, chunk_size);
 
@@ -1381,7 +1381,7 @@ static int ReassembleRaw(TcpSession *ssn, TcpStream *stream, Packet *p)
             SCLogDebug("adjusting left_edge to not be before base_seq: left_edge %u", rel_left_edge);
         }
 
-        progress = stream->base_seq_offset + (rel_left_edge - stream->base_seq);
+        progress = STREAM_BASE_OFFSET(stream) + (rel_left_edge - stream->base_seq);
         right_edge_abs = progress + chunk_size;
         SCLogDebug("working with progress %"PRIu64, progress);
 
@@ -1445,7 +1445,7 @@ static int ReassembleRaw(TcpSession *ssn, TcpStream *stream, Packet *p)
         going from 'progress' to SEQ => (progress - base_seq_offset) + base_seq;
         */
 #define GET_SEQ_FOR_PROGRESS(stream, progress) \
-            (((progress) - (stream)->base_seq_offset) + (stream->base_seq))
+            (((progress) - STREAM_BASE_OFFSET((stream))) + (stream->base_seq))
 
         /* we have data. Use it to setup StreamMsg(s) */
         StreamMsg *smsg = NULL;