1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-23 02:35:57 +01:00

TCPStreamFollower now handles overlapping fragments.

This commit is contained in:
Matias Fontanini
2014-04-02 11:10:44 -03:00
parent 10421fe945
commit 64d35b4903
3 changed files with 229 additions and 21 deletions

View File

@@ -185,7 +185,9 @@ private:
static fragments_type clone_fragments(const fragments_type &frags);
bool generic_process(uint32_t &my_seq, uint32_t &other_seq,
payload_type &pload, fragments_type &frags, TCP *tcp, RawPDU *raw);
payload_type &pload, fragments_type &frags, TCP *tcp);
void safe_insert(fragments_type &frags, uint32_t seq, RawPDU *raw);
uint32_t client_seq, server_seq;

View File

@@ -27,11 +27,57 @@
*
*/
#include <limits>
#include "rawpdu.h"
#include "tcp_stream.h"
namespace Tins {
// As defined by RFC 1982 - 2 ^ (SERIAL_BITS - 1)
static const uint32_t seq_number_diff = 2147483648;
// As defined by RFC 1982 - 2 ^ (SERIAL_BITS)
static const uint32_t addition_modulo = std::numeric_limits<uint32_t>::max();
// Sequence number add as defined by RFC 1982
uint32_t add_sequence_numbers(uint32_t seq1, uint32_t seq2) {
return (static_cast<uint64_t>(seq1) + seq2) % addition_modulo;
}
// Subtract sequence numbers
uint32_t subtract_sequence_numbers(uint32_t seq1, uint32_t seq2) {
if(seq1 > seq2)
return seq1 - seq2;
else
// the numbers between seq2 and the maximum sequence number(including seq1)
// + the numbers between 0 and seq1
return (std::numeric_limits<uint32_t>::max() - seq2) + seq1 + 1;
}
// Compares sequence numbers as defined by RFC 1982.
int compare_seq_numbers(uint32_t seq1, uint32_t seq2) {
if(seq1 == seq2)
return 0;
if(seq1 < seq2) {
return (seq2 - seq1 < seq_number_diff) ? -1 : 1;
}
else {
return (seq1 - seq2 > seq_number_diff) ? -1 : 1;
}
}
template<typename Iterator, typename Container>
Iterator erase_iterator(Iterator it, Container& cont) {
Iterator output = it;
++output;
cont.erase(it);
if(output == cont.end())
output = cont.begin();
return output;
}
// TCPStreamFollower
TCPStreamFollower::TCPStreamFollower() : last_identifier(0) {
}
@@ -92,33 +138,92 @@ TCPStream::fragments_type TCPStream::clone_fragments(const fragments_type &frags
return new_frags;
}
void TCPStream::safe_insert(fragments_type &frags, uint32_t seq, RawPDU *raw)
{
RawPDU*& stored_raw = frags[seq];
// New segment, insert it
if(stored_raw == 0)
stored_raw = raw;
else {
// There was a segment in this position. Keep the largest one.
if(stored_raw->payload_size() > raw->payload_size())
delete raw;
else {
delete stored_raw;
stored_raw = raw;
}
}
}
bool TCPStream::generic_process(uint32_t &my_seq, uint32_t &other_seq,
payload_type &pload, fragments_type &frags, TCP *tcp, RawPDU *raw)
payload_type &pload, fragments_type &frags, TCP *tcp)
{
bool added_some(false);
if(tcp->get_flag(TCP::FIN) || tcp->get_flag(TCP::RST))
fin_sent = true;
if(raw && tcp->seq() >= my_seq) {
frags[tcp->seq()] = static_cast<RawPDU*>(tcp->release_inner_pdu());
fragments_type::iterator it = frags.begin();
while(it != frags.end() && it->first == my_seq) {
pload.insert(
pload.end(),
it->second->payload().begin(),
it->second->payload().end()
);
my_seq += it->second->payload_size();
delete it->second;
frags.erase(it);
it = frags.begin();
added_some = true;
RawPDU *raw = static_cast<RawPDU*>(tcp->release_inner_pdu());
if(raw) {
const uint32_t chunk_end = add_sequence_numbers(tcp->seq(), raw->payload_size());
// If the end of the chunk ends after our current sequence number, process it.
if(compare_seq_numbers(chunk_end, my_seq) >= 0) {
uint32_t seq = tcp->seq();
// If it starts before our sequence number, slice it
if(compare_seq_numbers(seq, my_seq) < 0) {
const uint32_t diff = subtract_sequence_numbers(my_seq, seq);
raw->payload().erase(
raw->payload().begin(),
raw->payload().begin() + diff
);
seq = my_seq;
}
safe_insert(frags, seq, raw);
fragments_type::iterator it = frags.find(my_seq);
// Keep looping while the fragments seq is lower or equal to our seq
while(it != frags.end() && compare_seq_numbers(it->first, my_seq) <= 0) {
// Does this fragment start before our sequence number?
if(compare_seq_numbers(it->first, my_seq) < 0) {
uint32_t fragment_end = add_sequence_numbers(it->first, it->second->payload_size());
int comparison = compare_seq_numbers(fragment_end, my_seq);
// Does it end after our sequence number?
if(comparison > 0) {
// Then slice it
RawPDU::payload_type& payload = it->second->payload();
payload.erase(
payload.begin(),
payload.begin() + subtract_sequence_numbers(my_seq, it->first)
);
safe_insert(frags, my_seq, it->second);
it = erase_iterator(it, frags);
}
else {
// Otherwise, we've seen this part of the payload. Erase it.
delete it->second;
it = erase_iterator(it, frags);
}
}
else {
// They're equal. Add this payload.
pload.insert(
pload.end(),
it->second->payload().begin(),
it->second->payload().end()
);
my_seq += it->second->payload_size();
delete it->second;
it = erase_iterator(it, frags);
if(frags.empty())
break;
}
added_some = true;
}
}
else
delete raw;
}
return added_some;
}
bool TCPStream::update(IP *ip, TCP *tcp) {
RawPDU *raw = tcp->find_pdu<RawPDU>();
if(!syn_ack_sent && tcp->get_flag(TCP::SYN) && tcp->get_flag(TCP::ACK)) {
server_seq = tcp->seq() + 1;
client_seq = tcp->ack_seq();
@@ -127,9 +232,9 @@ bool TCPStream::update(IP *ip, TCP *tcp) {
}
else {
if(ip->src_addr() == info.client_addr)
return generic_process(client_seq, server_seq, client_payload_, client_frags, tcp, raw);
return generic_process(client_seq, server_seq, client_payload_, client_frags, tcp);
else
return generic_process(server_seq, client_seq, server_payload_, server_frags, tcp, raw);
return generic_process(server_seq, client_seq, server_payload_, server_frags, tcp);
}
}

View File

@@ -12,11 +12,14 @@ using namespace Tins;
class TCPStreamTest : public testing::Test {
public:
static const size_t num_packets = 20;
static EthernetII packets[];
static EthernetII packets[], overlapped_packets1[],
overlapped_packets2[], overlapped_packets3[],
overlapped_packets4[], overlapped_packets5[];
static const size_t indexes[][num_packets];
static const std::string payload;
static void end_handle(TCPStream& session);
static void overlapped_end_handle(TCPStream& session);
static size_t index;
static bool processed_stream;
@@ -48,6 +51,69 @@ EthernetII TCPStreamTest::packets[] = {
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x34\xfd\x0d\x40\x00\x40\x06\x3f\xb4\x7f\x00\x00\x01\x7f\x00\x00\x01\xa3\x78\x0b\xb8\xb1\xe6\x18\x71\x37\x67\x56\xd5\x80\x10\x08\x02\xfe\x28\x00\x00\x01\x01\x08\x0a\x2d\x1b\x0d\xd2\x2d\x1b\x0d\xd2", 66)
};
EthernetII TCPStreamTest::overlapped_packets1[] = {
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x1c\x29\x4d\x5e\x00\x00\x00\x00\x50\x02\x20\x00\x9e\x8d\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xec\x62\x2c\x11\x1c\x29\x4d\x5f\x50\x12\x20\x00\x86\x08\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x1c\x29\x4d\x5f\xec\x62\x2c\x12\x50\x10\x20\x00\x86\x09\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2e\x00\x01\x00\x00\x40\x06\xf8\x97\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x1c\x29\x4d\x60\xec\x62\x2c\x12\x50\x10\x20\x00\xba\x4a\x00\x00\x45\x53\x54\x31\x32\x33", 60),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2b\x00\x01\x00\x00\x40\x06\xf8\x9a\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x1c\x29\x4d\x66\xec\x62\x2c\x12\x50\x10\x20\x00\x1b\xca\x00\x00\x34\x35\x36", 57),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x30\x00\x01\x00\x00\x40\x06\xf8\x95\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x1c\x29\x4d\x5f\xec\x62\x2c\x12\x50\x10\x20\x00\x7a\x01\x00\x00\x54\x45\x53\x54\x31\x32\x33\x34", 62),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2c\x00\x01\x00\x00\x40\x06\xf8\x99\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x1c\x29\x4d\x69\xec\x62\x2c\x12\x50\x10\x20\x00\x15\x93\x00\x00\x37\x38\x39\x30", 58),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xec\x62\x2c\x12\x1c\x29\x4d\x63\x50\x10\x20\x00\x86\x05\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x1c\x29\x4d\x63\xec\x62\x2c\x12\x50\x11\x20\x00\x86\x04\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xec\x62\x2c\x12\x1c\x29\x4d\x63\x50\x11\x20\x00\x86\x04\x00\x00", 54)
};
EthernetII TCPStreamTest::overlapped_packets2[] = {
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x0c\x82\x17\xfa\x00\x00\x00\x00\x50\x02\x20\x00\xe3\x98\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xad\x96\xb1\x46\x0c\x82\x17\xfb\x50\x12\x20\x00\x84\xaa\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x0c\x82\x17\xfb\xad\x96\xb1\x47\x50\x10\x20\x00\x84\xab\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2d\x00\x01\x00\x00\x40\x06\xf8\x98\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x0c\x82\x17\xfb\xad\x96\xb1\x47\x50\x10\x20\x00\xac\x0c\x00\x00\x54\x45\x53\x54\x31", 59),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2e\x00\x01\x00\x00\x40\x06\xf8\x97\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x0c\x82\x17\xfb\xad\x96\xb1\x47\x50\x10\x20\x00\xab\xd9\x00\x00\x54\x45\x53\x54\x31\x32", 60),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x36\x00\x01\x00\x00\x40\x06\xf8\x8f\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x0c\x82\x17\xfb\xad\x96\xb1\x47\x50\x10\x20\x00\xd2\xfe\x00\x00\x54\x45\x53\x54\x31\x32\x33\x34\x35\x36\x37\x38\x39\x30", 68),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xad\x96\xb1\x47\x0c\x82\x18\x09\x50\x10\x20\x00\x84\x9d\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x0c\x82\x18\x09\xad\x96\xb1\x47\x50\x11\x20\x00\x84\x9c\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xad\x96\xb1\x47\x0c\x82\x18\x09\x50\x11\x20\x00\x84\x9c\x00\x00", 54)
};
EthernetII TCPStreamTest::overlapped_packets3[] = {
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xfc\x00\x00\x00\x00\x50\x02\x20\x00\x08\x18\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\x36\xe3\xaa\x90\xff\xff\xff\xfd\x50\x12\x20\x00\x26\x93\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xfd\x36\xe3\xaa\x91\x50\x10\x20\x00\x26\x94\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2d\x00\x01\x00\x00\x40\x06\xf8\x98\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xff\x36\xe3\xaa\x91\x50\x10\x20\x00\x6f\x06\x00\x00\x53\x54\x31\x32\x33", 59),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2d\x00\x01\x00\x00\x40\x06\xf8\x98\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xfe\x36\xe3\xaa\x91\x50\x10\x20\x00\x5b\x09\x00\x00\x45\x53\x54\x31\x32", 59),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2d\x00\x01\x00\x00\x40\x06\xf8\x98\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xfd\x36\xe3\xaa\x91\x50\x10\x20\x00\x4d\xf5\x00\x00\x54\x45\x53\x54\x31", 59),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\x36\xe3\xaa\x91\x00\x00\x00\x04\x50\x10\x20\x00\x26\x8e\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2f\x00\x01\x00\x00\x40\x06\xf8\x96\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x00\x00\x00\x04\x36\xe3\xaa\x91\x50\x10\x20\x00\x53\xe1\x00\x00\x34\x35\x36\x37\x38\x39\x30", 61),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\x36\xe3\xaa\x91\x00\x00\x00\x0b\x50\x10\x20\x00\x26\x87\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x00\x00\x00\x0b\x36\xe3\xaa\x91\x50\x11\x20\x00\x26\x86\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\x36\xe3\xaa\x91\x00\x00\x00\x0b\x50\x11\x20\x00\x26\x86\x00\x00", 54)
};
EthernetII TCPStreamTest::overlapped_packets4[] = {
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xfc\x00\x00\x00\x00\x50\x02\x20\x00\x08\x18\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xbf\xcf\x3a\xf1\xff\xff\xff\xfd\x50\x12\x20\x00\x0d\x46\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xfd\xbf\xcf\x3a\xf2\x50\x10\x20\x00\x0d\x47\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2d\x00\x01\x00\x00\x40\x06\xf8\x98\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xff\xbf\xcf\x3a\xf2\x50\x10\x20\x00\x55\xb9\x00\x00\x53\x54\x31\x32\x33", 59),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2d\x00\x01\x00\x00\x40\x06\xf8\x98\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\xff\xff\xff\xfd\xbf\xcf\x3a\xf2\x50\x10\x20\x00\x34\xa8\x00\x00\x54\x45\x53\x54\x31", 59),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xbf\xcf\x3a\xf2\x00\x00\x00\x04\x50\x10\x20\x00\x0d\x41\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2f\x00\x01\x00\x00\x40\x06\xf8\x96\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x00\x00\x00\x04\xbf\xcf\x3a\xf2\x50\x10\x20\x00\x3a\x94\x00\x00\x34\x35\x36\x37\x38\x39\x30", 61),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xbf\xcf\x3a\xf2\x00\x00\x00\x0b\x50\x10\x20\x00\x0d\x3a\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x00\x00\x00\x0b\xbf\xcf\x3a\xf2\x50\x11\x20\x00\x0d\x39\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xbf\xcf\x3a\xf2\x00\x00\x00\x0b\x50\x11\x20\x00\x0d\x39\x00\x00", 54)
};
EthernetII TCPStreamTest::overlapped_packets5[] = {
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x2f\x0e\x6b\x30\x00\x00\x00\x00\x50\x02\x20\x00\x6d\xd6\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xfb\xd7\xfc\x4d\x2f\x0e\x6b\x31\x50\x12\x20\x00\x75\x9f\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x2f\x0e\x6b\x31\xfb\xd7\xfc\x4e\x50\x10\x20\x00\x75\xa0\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x2d\x00\x01\x00\x00\x40\x06\xf8\x98\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x2f\x0e\x6b\x31\xfb\xd7\xfc\x4e\x50\x10\x20\x00\x9d\x01\x00\x00\x54\x45\x53\x54\x31", 59),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x36\x00\x01\x00\x00\x40\x06\xf8\x8f\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x2f\x0e\x6b\x31\xfb\xd7\xfc\x4e\x50\x10\x20\x00\xc3\xf3\x00\x00\x54\x45\x53\x54\x31\x32\x33\x34\x35\x36\x37\x38\x39\x30", 68),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xfb\xd7\xfc\x4e\x2f\x0e\x6b\x3f\x50\x10\x20\x00\x75\x92\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x70\xc0\xa8\x00\x71\x05\x39\x00\x63\x2f\x0e\x6b\x3f\xfb\xd7\xfc\x4e\x50\x11\x20\x00\x75\x91\x00\x00", 54),
EthernetII((const uint8_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x45\x00\x00\x28\x00\x01\x00\x00\x40\x06\xf8\x9d\xc0\xa8\x00\x71\xc0\xa8\x00\x70\x00\x63\x05\x39\xfb\xd7\xfc\x4e\x2f\x0e\x6b\x3f\x50\x11\x20\x00\x75\x91\x00\x00", 54)
};
const size_t TCPStreamTest::indexes[][num_packets] = {
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19},
{0,1,2,3,5,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19},
@@ -59,7 +125,7 @@ const size_t TCPStreamTest::indexes[][num_packets] = {
const std::string TCPStreamTest::payload = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at aliquam arcu. Sed at iaculis magna. Nam ut dolor eget velit mattis posuere ut non dui. Aliquam faucibus erat pretium ligula tincidunt eget tristique justo placerat. Phasellus turpis tellus, ornare ultricies egestas vitae, mollis sed neque. Sed et libero in nunc pharetra auctor ut a eros. Mauris quis faucibus nibh. \nLorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at aliquam arcu. Sed at iaculis magna. Nam ut dolor eget velit mattis posuere ut non dui. Aliquam faucibus erat pretium ligula tincidunt eget tristique justo placerat. Phasellus turpis tellus, ornare ultricies egestas vitae, mollis sed neque. Sed et libero in nunc pharetra auctor ut a eros. Mauris quis faucibus nibh. \n\n\nCurabitur sem erat, bibendum quis condimentum ut, imperdiet at est. Duis sagittis rhoncus felis at ultricies. In libero urna, dignissim eu elementum quis, consectetur a neque. Praesent leo sem, cursus sed lobortis sit amet, ornare ac augue. Mauris tristique semper ipsum at consequat. Sed fringilla dolor ut lacus sagittis quis ultricies leo vulputate. Maecenas dignissim imperdiet justo. Cras libero odio, vehicula et adipiscing quis, luctus vel ante. \nAliquam imperdiet est quis nunc malesuada eget convallis tellus ullamcorper. Vivamus ullamcorper eros sit amet odio sollicitudin rutrum. Donec pellentesque faucibus nulla, ut fringilla risus aliquam eget. Sed et ante mi. Morbi a turpis et tellus dapibus iaculis. Etiam faucibus tellus sed metus consequat rutrum. Fusce sit amet nulla massa, tempus vulputate sem. Cras tincidunt quam in libero rutrum interdum. Aliquam quam sapien, facilisis at vestibulum et, venenatis id mauris. Morbi rutrum gravida ultricies. \nAenean et justo ut libero euismod sollicitudin. Nullam enim dui, iaculis vitae bibendum et, commodo in tellus. Nullam eget purus mi, a ullamcorper lorem. Suspendisse potenti. Duis ac justo ut leo euismod gravida sit amet at lectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed arcu vitae nisi sollicitudin gravida. Nulla facilisis nibh turpis. Maecenas quis imperdiet arcu. Sed sit amet nulla urna, at vestibulum mauris. Suspendisse quis elit dui. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. \n";
void data_handle(TCPStream&) {
}
void TCPStreamTest::end_handle(TCPStream& session) {
@@ -79,3 +145,38 @@ TEST_F(TCPStreamTest, FollowStreams) {
EXPECT_TRUE(processed_stream);
}
}
void TCPStreamTest::overlapped_end_handle(TCPStream& session) {
processed_stream = true;
std::string payload = "TEST1234567890";
std::string session_payload(session.client_payload().begin(), session.client_payload().end());
EXPECT_EQ(payload, session_payload);
}
TEST_F(TCPStreamTest, FollowOverlappedStreams1) {
TCPStreamFollower follower;
processed_stream = false;
follower.follow_streams(overlapped_packets1, overlapped_packets1 + 10, data_handle, &TCPStreamTest::overlapped_end_handle);
EXPECT_TRUE(processed_stream);
}
TEST_F(TCPStreamTest, FollowOverlappedStreams2) {
TCPStreamFollower follower;
processed_stream = false;
follower.follow_streams(overlapped_packets2, overlapped_packets2 + 9, data_handle, &TCPStreamTest::overlapped_end_handle);
EXPECT_TRUE(processed_stream);
}
TEST_F(TCPStreamTest, FollowOverlappedStreams4) {
TCPStreamFollower follower;
processed_stream = false;
follower.follow_streams(overlapped_packets4, overlapped_packets4 + 10, data_handle, &TCPStreamTest::overlapped_end_handle);
EXPECT_TRUE(processed_stream);
}
TEST_F(TCPStreamTest, FollowOverlappedStreams5) {
TCPStreamFollower follower;
processed_stream = false;
follower.follow_streams(overlapped_packets5, overlapped_packets5 + 8, data_handle, &TCPStreamTest::overlapped_end_handle);
EXPECT_TRUE(processed_stream);
}