diff --git a/src/stream-tcp-list.c b/src/stream-tcp-list.c index ba0fd6ce2b..6007bae85e 100644 --- a/src/stream-tcp-list.c +++ b/src/stream-tcp-list.c @@ -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)); } } diff --git a/src/stream-tcp-private.h b/src/stream-tcp-private.h index 773e74d7d5..448efba5ee 100644 --- a/src/stream-tcp-private.h +++ b/src/stream-tcp-private.h @@ -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 { diff --git a/src/stream-tcp-reassemble.c b/src/stream-tcp-reassemble.c index bd1dfab391..979893d3c3 100644 --- a/src/stream-tcp-reassemble.c +++ b/src/stream-tcp-reassemble.c @@ -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;