]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
stream: use static instead of dynamic streaming buffer structure
authorVictor Julien <victor@inliniac.net>
Thu, 28 Apr 2016 15:21:28 +0000 (17:21 +0200)
committerVictor Julien <victor@inliniac.net>
Thu, 20 Apr 2017 15:41:11 +0000 (17:41 +0200)
src/output-streaming.c
src/stream-tcp-inline.c
src/stream-tcp-list.c
src/stream-tcp-private.h
src/stream-tcp-reassemble.c
src/stream-tcp-util.c
src/stream-tcp.c
src/tests/stream-tcp-list.c

index 48c6abd57c0594556fa3e85b2d36f030aea98fe1..c32b113d2e597e101a3f27ff172d2622c69439e2 100644 (file)
@@ -280,7 +280,7 @@ int StreamIterator(Flow *f, TcpStream *stream, int close, void *cbdata, uint8_t
 
             const uint8_t *seg_data;
             uint32_t seg_datalen;
-            StreamingBufferSegmentGetData(stream->sb, &seg->sbseg, &seg_data, &seg_datalen);
+            StreamingBufferSegmentGetData(&stream->sb, &seg->sbseg, &seg_data, &seg_datalen);
 
             Streamer(cbdata, f, seg_data, seg_datalen, 0, flags);
 
index b640b69bc4bf954d1eb7c5375a815b9e10b208e4..663d9d2dfa0c3e9076b5947aaeb7a8f59895866a 100644 (file)
@@ -68,7 +68,7 @@ int StreamTcpInlineSegmentCompare(TcpStream *stream, Packet *p, TcpSegment *seg)
 
     const uint8_t *seg_data;
     uint32_t seg_datalen;
-    StreamingBufferSegmentGetData(stream->sb, &seg->sbseg, &seg_data, &seg_datalen);
+    StreamingBufferSegmentGetData(&stream->sb, &seg->sbseg, &seg_data, &seg_datalen);
     if (seg_data == NULL || seg_datalen == 0)
         SCReturnInt(0);
 
@@ -138,7 +138,7 @@ void StreamTcpInlineSegmentReplacePacket(TcpStream *stream, Packet *p, TcpSegmen
 
     const uint8_t *seg_data;
     uint32_t seg_datalen;
-    StreamingBufferSegmentGetData(stream->sb, &seg->sbseg, &seg_data, &seg_datalen);
+    StreamingBufferSegmentGetData(&stream->sb, &seg->sbseg, &seg_data, &seg_datalen);
 
     uint32_t pend = pseq + p->payload_len;
     uint32_t tend = tseq + seg_datalen;
@@ -175,7 +175,7 @@ void StreamTcpInlineSegmentReplacePacket(TcpStream *stream, Packet *p, TcpSegmen
 
 static int VALIDATE(TcpStream *stream, uint8_t *data, uint32_t data_len)
 {
-    if (StreamingBufferCompareRawData(stream->sb,
+    if (StreamingBufferCompareRawData(&stream->sb,
                 data, data_len) == 0)
     {
         SCReturnInt(0);
index 95f3dbc16f765e56897edba8a7b549f25bf79613..524a0a4e1681a22953b7453c9c0af05e9c5f61d9 100644 (file)
@@ -68,14 +68,14 @@ static inline int InsertSegmentDataCustom(TcpStream *stream, TcpSegment *seg, ui
 
     SCLogDebug("stream %p buffer %p, stream_offset %"PRIu64", "
                "data_offset %"PRIu16", SEQ %u BASE %u, data_len %u",
-               stream, stream->sb, stream_offset,
+               stream, &stream->sb, stream_offset,
                data_offset, seg->seq, stream->base_seq, data_len);
     BUG_ON(data_offset > data_len);
     if (data_len == data_offset) {
         SCReturnInt(0);
     }
 
-    if (StreamingBufferInsertAt(stream->sb, &seg->sbseg,
+    if (StreamingBufferInsertAt(&stream->sb, &seg->sbseg,
                 data + data_offset,
                 data_len - data_offset,
                 stream_offset) != 0) {
@@ -86,10 +86,10 @@ static inline int InsertSegmentDataCustom(TcpStream *stream, TcpSegment *seg, ui
         const uint8_t *mydata;
         uint32_t mydata_len;
         uint64_t mydata_offset;
-        StreamingBufferGetData(stream->sb, &mydata, &mydata_len, &mydata_offset);
+        StreamingBufferGetData(&stream->sb, &mydata, &mydata_len, &mydata_offset);
 
         SCLogDebug("stream %p seg %p data in buffer %p of len %u and offset %u",
-                stream, seg, stream->sb, mydata_len, (uint)mydata_offset);
+                stream, seg, &stream->sb, mydata_len, (uint)mydata_offset);
         //PrintRawDataFp(stdout, mydata, mydata_len);
     }
 #endif
@@ -111,13 +111,6 @@ static inline int InsertSegmentDataCustom(TcpStream *stream, TcpSegment *seg, ui
  */
 static int DoInsertSegment (TcpStream *stream, TcpSegment *seg, Packet *p)
 {
-    if (unlikely(stream->sb == NULL)) {
-        stream->sb = StreamingBufferInit(&stream_config.sbcnf);
-        if (stream->sb == NULL) {
-            return -1;
-        }
-    }
-
     /* before our base_seq we don't insert it in our list */
     if (SEQ_LEQ((seg->seq + TCP_SEG_LEN(seg)), stream->base_seq))
     {
@@ -369,7 +362,7 @@ static int DoHandleDataOverlap(TcpStream *stream, TcpSegment *list, TcpSegment *
         uint32_t list_seq = list->seq;
 
         const uint8_t *list_data;
-        StreamingBufferSegmentGetData(stream->sb, &list->sbseg, &list_data, &list_len);
+        StreamingBufferSegmentGetData(&stream->sb, &list->sbseg, &list_data, &list_len);
         if (list_data == NULL || list_len == 0)
             return 0;
         BUG_ON(list_len > USHRT_MAX);
@@ -629,7 +622,7 @@ static inline int StreamTcpReturnSegmentCheck(const Flow *f, TcpSession *ssn, Tc
         SCReturnInt(0);
     }
 
-    if (!(StreamingBufferSegmentIsBeforeWindow(stream->sb, &seg->sbseg))) {
+    if (!(StreamingBufferSegmentIsBeforeWindow(&stream->sb, &seg->sbseg))) {
         SCReturnInt(0);
     }
 
@@ -681,7 +674,7 @@ static inline uint64_t GetLeftEdge(TcpSession *ssn, TcpStream *stream)
         SCLogDebug("left_edge %"PRIu64", using only app:%"PRIu64,
                 left_edge, STREAM_APP_PROGRESS(stream));
     } else {
-        left_edge = STREAM_BASE_OFFSET(stream) + stream->sb->buf_offset;
+        left_edge = STREAM_BASE_OFFSET(stream) + stream->sb.buf_offset;
         SCLogDebug("no app & raw: left_edge %"PRIu64" (full stream)", left_edge);
     }
 
@@ -756,7 +749,7 @@ void StreamTcpPruneSession(Flow *f, uint8_t flags)
     if (left_edge && 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);
+        StreamingBufferSlideToOffset(&stream->sb, left_edge);
         stream->base_seq += slide;
 
         if (slide <= stream->app_progress_rel) {
@@ -764,7 +757,6 @@ void StreamTcpPruneSession(Flow *f, uint8_t flags)
         } else {
             stream->app_progress_rel = 0;
         }
-
         if (slide <= stream->raw_progress_rel) {
             stream->raw_progress_rel -= slide;
         } else {
index 87fff2c601e07fce757c48779afbec94a3b067f7..4f2716027d7986394854770b2f604acbd6ae1be6 100644 (file)
@@ -90,7 +90,7 @@ typedef struct TcpStream_ {
     uint32_t app_progress_rel;      /**< app-layer progress relative to STREAM_BASE_OFFSET */
     uint32_t raw_progress_rel;      /**< raw reassembly progress relative to STREAM_BASE_OFFSET */
 
-    StreamingBuffer *sb;
+    StreamingBuffer sb;
 
     TcpSegment *seg_list;           /**< list of TCP segments that are not yet (fully) used in reassembly */
     TcpSegment *seg_list_tail;      /**< Last segment in the reassembled stream seg list*/
@@ -99,7 +99,7 @@ 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)
+#define STREAM_BASE_OFFSET(stream)  ((stream)->sb.stream_offset)
 #define STREAM_APP_PROGRESS(stream) (STREAM_BASE_OFFSET((stream)) + (stream)->app_progress_rel)
 #define STREAM_RAW_PROGRESS(stream) (STREAM_BASE_OFFSET((stream)) + (stream)->raw_progress_rel)
 
index d2f2b971b8505690a67beb8d3f3d4bb8baa7bd50..e56ebacd314e1b7c38da711ccb618f0bb83dcbdb 100644 (file)
@@ -1087,15 +1087,15 @@ static void GetAppBuffer(TcpStream *stream, const uint8_t **data, uint32_t *data
     const uint8_t *mydata;
     uint32_t mydata_len;
 
-    if (stream->sb->block_list == NULL) {
+    if (stream->sb.block_list == NULL) {
         SCLogDebug("getting one blob");
 
-        StreamingBufferGetDataAtOffset(stream->sb, &mydata, &mydata_len, offset);
+        StreamingBufferGetDataAtOffset(&stream->sb, &mydata, &mydata_len, offset);
 
         *data = mydata;
         *data_len = mydata_len;
     } else {
-        StreamingBufferBlock *blk = stream->sb->block_list;
+        StreamingBufferBlock *blk = stream->sb.block_list;
 
         if (blk->offset > offset) {
             SCLogDebug("gap, want data at offset %"PRIu64", got data at %"PRIu64,
@@ -1106,10 +1106,10 @@ static void GetAppBuffer(TcpStream *stream, const uint8_t **data, uint32_t *data
         } else if (offset > blk->offset && offset <= (blk->offset + blk->len)) {
             SCLogDebug("get data from offset %"PRIu64". SBB %"PRIu64"/%u",
                     offset, blk->offset, blk->len);
-            StreamingBufferSBBGetDataAtOffset(stream->sb, blk, data, data_len, offset);
+            StreamingBufferSBBGetDataAtOffset(&stream->sb, blk, data, data_len, offset);
             SCLogDebug("data %p, data_len %u", *data, *data_len);
         } else {
-            StreamingBufferSBBGetData(stream->sb, blk, data, data_len);
+            StreamingBufferSBBGetData(&stream->sb, blk, data, data_len);
         }
     }
 }
@@ -1142,7 +1142,7 @@ static int ReassembleUpdateAppLayer (ThreadVars *tv,
     //PrintRawDataFp(stdout, mydata, mydata_len);
 
     SCLogDebug("stream %p data in buffer %p of len %u and offset %"PRIu64,
-            stream, stream->sb, mydata_len, app_progress);
+            stream, &stream->sb, mydata_len, app_progress);
 
     /* get window of data that is acked */
     if (StreamTcpInlineMode() == 0 && (p->flags & PKT_PSEUDO_STREAM_END)) {
@@ -1297,14 +1297,14 @@ static int GetRawBuffer(TcpStream *stream, const uint8_t **data, uint32_t *data_
 {
     const uint8_t *mydata;
     uint32_t mydata_len;
-    if (stream->sb->block_list == NULL) {
+    if (stream->sb.block_list == NULL) {
         SCLogDebug("getting one blob");
 
         uint64_t roffset = offset;
         if (offset)
-            StreamingBufferGetDataAtOffset(stream->sb, &mydata, &mydata_len, offset);
+            StreamingBufferGetDataAtOffset(&stream->sb, &mydata, &mydata_len, offset);
         else {
-            StreamingBufferGetData(stream->sb, &mydata, &mydata_len, &roffset);
+            StreamingBufferGetData(&stream->sb, &mydata, &mydata_len, &roffset);
         }
 
         *data = mydata;
@@ -1312,7 +1312,7 @@ static int GetRawBuffer(TcpStream *stream, const uint8_t **data, uint32_t *data_
         *data_offset = roffset;
     } else {
         if (*iter == NULL)
-            *iter = stream->sb->block_list;
+            *iter = stream->sb.block_list;
         if (*iter == NULL) {
             *data = NULL;
             *data_len = 0;
@@ -1332,7 +1332,7 @@ static int GetRawBuffer(TcpStream *stream, const uint8_t **data, uint32_t *data_
 
         SCLogDebug("getting multiple blobs. Iter %p, %"PRIu64"/%u (next? %s)", *iter, (*iter)->offset, (*iter)->len, (*iter)->next ? "yes":"no");
 
-        StreamingBufferSBBGetData(stream->sb, (*iter), &mydata, &mydata_len);
+        StreamingBufferSBBGetData(&stream->sb, (*iter), &mydata, &mydata_len);
 
         if ((*iter)->offset < offset) {
             uint64_t delta = offset - (*iter)->offset;
@@ -1418,7 +1418,7 @@ static int ReassembleRaw(TcpSession *ssn, TcpStream *stream, Packet *p)
 
         SCLogDebug("raw progress %"PRIu64, progress);
         SCLogDebug("stream %p data in buffer %p of len %u and offset %u",
-                stream, stream->sb, mydata_len, (uint)progress);
+                stream, &stream->sb, mydata_len, (uint)progress);
 
         if (StreamTcpInlineMode() == 0 && (p->flags & PKT_PSEUDO_STREAM_END)) {
             //
@@ -2017,7 +2017,7 @@ void StreamTcpCreateTestPacket(uint8_t *payload, uint8_t value,
 
 int StreamTcpCheckStreamContents(uint8_t *stream_policy, uint16_t sp_size, TcpStream *stream)
 {
-    if (StreamingBufferCompareRawData(stream->sb, stream_policy,(uint32_t)sp_size) == 0)
+    if (StreamingBufferCompareRawData(&stream->sb, stream_policy,(uint32_t)sp_size) == 0)
     {
         //PrintRawDataFp(stdout, stream_policy, sp_size);
         return 0;
@@ -2027,7 +2027,7 @@ int StreamTcpCheckStreamContents(uint8_t *stream_policy, uint16_t sp_size, TcpSt
 
 static int VALIDATE(TcpStream *stream, uint8_t *data, uint32_t data_len)
 {
-    if (StreamingBufferCompareRawData(stream->sb,
+    if (StreamingBufferCompareRawData(&stream->sb,
                 data, data_len) == 0)
     {
         SCReturnInt(0);
index a810de519ae6108cb325ac62f4518511a633ed22..2c8fa8a0976a13ed8fd05fabeb64812197e0eb2c 100644 (file)
@@ -62,6 +62,10 @@ void StreamTcpUTInitInline(void) {
 void StreamTcpUTSetupSession(TcpSession *ssn)
 {
     memset(ssn, 0x00, sizeof(TcpSession));
+
+    StreamingBuffer x = STREAMING_BUFFER_INITIALIZER(&stream_config.sbcnf);
+    ssn->client.sb = x;
+    ssn->server.sb = x;
 }
 
 void StreamTcpUTClearSession(TcpSession *ssn)
@@ -69,6 +73,7 @@ void StreamTcpUTClearSession(TcpSession *ssn)
     StreamTcpUTClearStream(&ssn->client);
     StreamTcpUTClearStream(&ssn->server);
     StreamTcpSessionCleanup(ssn);
+    memset(ssn, 0x00, sizeof(TcpSession));
 }
 
 void StreamTcpUTSetupStream(TcpStream *s, uint32_t isn)
@@ -78,6 +83,9 @@ void StreamTcpUTSetupStream(TcpStream *s, uint32_t isn)
     s->isn = isn;
     STREAMTCP_SET_RA_BASE_SEQ(s, isn);
     s->base_seq = isn+1;
+
+    StreamingBuffer x = STREAMING_BUFFER_INITIALIZER(&stream_config.sbcnf);
+    s->sb = x;
 }
 
 void StreamTcpUTClearStream(TcpStream *s)
index 8cebb3da8b519b341dd82e7666465ebd48b973a3..07c332ff01cb6dd8c0915742ccd1e89dd9a155ff 100644 (file)
@@ -171,8 +171,7 @@ void StreamTcpStreamCleanup(TcpStream *stream)
     if (stream != NULL) {
         StreamTcpSackFreeList(stream);
         StreamTcpReturnStreamSegments(stream);
-        StreamingBufferFree(stream->sb);
-        stream->sb = NULL;
+        StreamingBufferClear(&stream->sb);
     }
 }
 
@@ -672,6 +671,10 @@ TcpSession *StreamTcpNewSession (Packet *p, int id)
         ssn->flags = stream_config.ssn_init_flags;
         ssn->tcp_packet_flags = p->tcph ? p->tcph->th_flags : 0;
 
+        StreamingBuffer x = STREAMING_BUFFER_INITIALIZER(&stream_config.sbcnf);
+        ssn->client.sb = x;
+        ssn->server.sb = x;
+
         if (PKT_IS_TOSERVER(p)) {
             ssn->client.tcp_flags = p->tcph ? p->tcph->th_flags : 0;
             ssn->server.tcp_flags = 0;
@@ -5820,7 +5823,7 @@ int StreamTcpSegmentForEach(const Packet *p, uint8_t flag, StreamSegmentCallback
     {
         const uint8_t *seg_data;
         uint32_t seg_datalen;
-        StreamingBufferSegmentGetData(stream->sb, &seg->sbseg, &seg_data, &seg_datalen);
+        StreamingBufferSegmentGetData(&stream->sb, &seg->sbseg, &seg_data, &seg_datalen);
 
         ret = CallbackFunc(p, data, seg_data, seg_datalen);
         if (ret != 1) {
index 631ef5bc8bb3766bf9cead9ed340d97e2b10f37c..428b391408b8a8e5b3b5f255e28b888f2451a7e9 100644 (file)
@@ -28,7 +28,7 @@
 
 static int VALIDATE(TcpStream *stream, uint8_t *data, uint32_t data_len)
 {
-    if (StreamingBufferCompareRawData(stream->sb,
+    if (StreamingBufferCompareRawData(&stream->sb,
                 data, data_len) == 0)
     {
         SCReturnInt(0);