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);
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);
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;
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);
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) {
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
*/
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))
{
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);
SCReturnInt(0);
}
- if (!(StreamingBufferSegmentIsBeforeWindow(stream->sb, &seg->sbseg))) {
+ if (!(StreamingBufferSegmentIsBeforeWindow(&stream->sb, &seg->sbseg))) {
SCReturnInt(0);
}
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);
}
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) {
} else {
stream->app_progress_rel = 0;
}
-
if (slide <= stream->raw_progress_rel) {
stream->raw_progress_rel -= slide;
} else {
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*/
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)
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,
} 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);
}
}
}
//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)) {
{
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;
*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;
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;
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)) {
//
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;
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);
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)
StreamTcpUTClearStream(&ssn->client);
StreamTcpUTClearStream(&ssn->server);
StreamTcpSessionCleanup(ssn);
+ memset(ssn, 0x00, sizeof(TcpSession));
}
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)
if (stream != NULL) {
StreamTcpSackFreeList(stream);
StreamTcpReturnStreamSegments(stream);
- StreamingBufferFree(stream->sb);
- stream->sb = NULL;
+ StreamingBufferClear(&stream->sb);
}
}
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;
{
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) {
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);