From: Victor Julien Date: Thu, 28 Apr 2016 15:21:28 +0000 (+0200) Subject: stream: use static instead of dynamic streaming buffer structure X-Git-Tag: suricata-4.0.0-beta1~176 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2a5b9c393168272a6759b94ef9fc111dd0af919;p=thirdparty%2Fsuricata.git stream: use static instead of dynamic streaming buffer structure --- diff --git a/src/output-streaming.c b/src/output-streaming.c index 48c6abd57c..c32b113d2e 100644 --- a/src/output-streaming.c +++ b/src/output-streaming.c @@ -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); diff --git a/src/stream-tcp-inline.c b/src/stream-tcp-inline.c index b640b69bc4..663d9d2dfa 100644 --- a/src/stream-tcp-inline.c +++ b/src/stream-tcp-inline.c @@ -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); diff --git a/src/stream-tcp-list.c b/src/stream-tcp-list.c index 95f3dbc16f..524a0a4e16 100644 --- a/src/stream-tcp-list.c +++ b/src/stream-tcp-list.c @@ -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 { diff --git a/src/stream-tcp-private.h b/src/stream-tcp-private.h index 87fff2c601..4f2716027d 100644 --- a/src/stream-tcp-private.h +++ b/src/stream-tcp-private.h @@ -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) diff --git a/src/stream-tcp-reassemble.c b/src/stream-tcp-reassemble.c index d2f2b971b8..e56ebacd31 100644 --- a/src/stream-tcp-reassemble.c +++ b/src/stream-tcp-reassemble.c @@ -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); diff --git a/src/stream-tcp-util.c b/src/stream-tcp-util.c index a810de519a..2c8fa8a097 100644 --- a/src/stream-tcp-util.c +++ b/src/stream-tcp-util.c @@ -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) diff --git a/src/stream-tcp.c b/src/stream-tcp.c index 8cebb3da8b..07c332ff01 100644 --- a/src/stream-tcp.c +++ b/src/stream-tcp.c @@ -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) { diff --git a/src/tests/stream-tcp-list.c b/src/tests/stream-tcp-list.c index 631ef5bc8b..428b391408 100644 --- a/src/tests/stream-tcp-list.c +++ b/src/tests/stream-tcp-list.c @@ -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);