aboutsummaryrefslogtreecommitdiff
path: root/analyzer/utils/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'analyzer/utils/tcp.c')
-rw-r--r--analyzer/utils/tcp.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/analyzer/utils/tcp.c b/analyzer/utils/tcp.c
index 7a79c67..add2a76 100644
--- a/analyzer/utils/tcp.c
+++ b/analyzer/utils/tcp.c
@@ -77,9 +77,7 @@ TCPSegment get_segment_from_packet(const byte_t *packet, const struct pcap_pkthd
TCPStream new_stream(ConnectionSource src) {
// clang-format off
TCPStream stream = {
- .data = safe_malloc(INIT_STREAM_CAPACITY),
- .len = 0,
- .capacity = INIT_STREAM_CAPACITY,
+ .bytes = array_new(1, INIT_STREAM_CAPACITY, NULL),
.seq = 0,
.port = 0,
.src = src,
@@ -90,13 +88,12 @@ TCPStream new_stream(ConnectionSource src) {
}
void destroy_stream(TCPStream stream) {
- free(stream.data);
+ array_destroy(stream.bytes);
heap_free(stream.pending);
}
void remove_parsed_data(TCPStream *stream, size_t parsed_len) {
- memmove(stream->data, stream->data + parsed_len, stream->len - parsed_len);
- stream->len -= parsed_len;
+ array_remove_front(&stream->bytes, parsed_len);
stream->seq += parsed_len;
}
@@ -104,7 +101,7 @@ void remove_parsed_data(TCPStream *stream, size_t parsed_len) {
// return the index of the first relevant byte in payload or -1 if segment isn't directly connected to stream
int get_first_relevant_byte_index(TCPStream stream, TCPSegment segment) {
// expected tcp sequence numbers for stream and segment
- uint32_t stream_expected = stream.seq + stream.len;
+ uint32_t stream_expected = stream.seq + stream.bytes.count;
uint32_t segment_expected = segment.seq + segment.len;
if (seq_in_range_ie(stream_expected, segment.seq, segment_expected))
return stream_expected - segment.seq;
@@ -114,16 +111,11 @@ int get_first_relevant_byte_index(TCPStream stream, TCPSegment segment) {
// check if the segment is in acceptable range to the stream
int in_acceptable_range(TCPStream stream, TCPSegment segment) {
// expected tcp sequence number for stream and max acceptable sequence number for segment
- uint32_t stream_expected = stream.seq + stream.len;
+ uint32_t stream_expected = stream.seq + stream.bytes.count;
uint32_t max_acceptable_seq = stream_expected + MAX_SEQ_OFFSET;
return seq_in_range_ei(segment.seq, stream_expected, max_acceptable_seq);
}
-// add segment directly to stream
-void add_segment(TCPStream *stream, TCPSegment segment, size_t data_start) {
- stream->data = array_concat(stream->data, 1, &stream->len, &stream->capacity, segment.payload + data_start, segment.len - data_start);
-}
-
// add pending segments to the stream
void add_pending_segments(TCPStream *stream) {
int top_changed = 1;
@@ -134,7 +126,7 @@ void add_pending_segments(TCPStream *stream) {
// add pending segment it it became directly connected
int data_start = get_first_relevant_byte_index(*stream, *top);
if (data_start != -1) {
- add_segment(stream, *top, data_start);
+ array_concat(&stream->bytes, top->payload + data_start, top->len - data_start);
top_changed = 1;
}
@@ -152,11 +144,11 @@ int handle_segment(TCPStream *stream, TCPSegment segment) {
heap_free(stream->pending);
stream->pending = heap_new(sizeof(TCPSegment), segments_compare, segment_cleanup);
- stream->len = 0;
+ array_remove_front(&stream->bytes, stream->bytes.count);
stream->seq = segment.seq;
stream->port = segment.port;
- add_segment(stream, segment, 0);
+ array_concat(&stream->bytes, segment.payload, segment.len);
free(segment.payload);
return 1;
}
@@ -164,7 +156,7 @@ int handle_segment(TCPStream *stream, TCPSegment segment) {
// add segment directly to the stream if it's directly connected
int data_start = get_first_relevant_byte_index(*stream, segment);
if (data_start != -1) {
- add_segment(stream, segment, data_start);
+ array_concat(&stream->bytes, segment.payload + data_start, segment.len - data_start);
free(segment.payload);
add_pending_segments(stream);
return 1;