303 lines
8.5 KiB
C++
303 lines
8.5 KiB
C++
|
|
#include <gtest/gtest.h>
|
||
|
|
|
||
|
|
#include "tcp_reassembly.h"
|
||
|
|
|
||
|
|
#if 0
|
||
|
|
const char *session_peek_tcp_payload(struct session *session, uint32_t *len)
|
||
|
|
{
|
||
|
|
struct session_dir *dir = session_get_cur_dir(session);
|
||
|
|
struct tcp_reassembly *assembler = session_get_tcp_reassembly(session);
|
||
|
|
return tcp_reassembly_peek(assembler, dir, len);
|
||
|
|
}
|
||
|
|
|
||
|
|
void session_consume_tcp_payload(struct session *session, uint32_t len)
|
||
|
|
{
|
||
|
|
struct session_dir *dir = session_get_cur_dir(session);
|
||
|
|
struct tcp_reassembly *assembler = session_get_tcp_reassembly(session);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, TEST_C2S)
|
||
|
|
{
|
||
|
|
uint32_t len;
|
||
|
|
int dir = 1;
|
||
|
|
const char *ptr;
|
||
|
|
struct tcp_reassembly *assembler;
|
||
|
|
|
||
|
|
assembler = tcp_reassembly_new(1, 10, 16, 1500);
|
||
|
|
EXPECT_TRUE(assembler != NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_init(assembler, 99, 199);
|
||
|
|
|
||
|
|
/*
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* |0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|A|B|C|D|E|F|G|H|I|J|
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | | |
|
||
|
|
* +---> 90 +---> 100 +---> 110
|
||
|
|
*/
|
||
|
|
|
||
|
|
// C2S
|
||
|
|
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 100, (const char *)"abcdefghij", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 110, (const char *)"ABCDEFGHIJ", 10, 0);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "ABCDEFGHIJ", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr == NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_free(assembler);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, TEST_S2C)
|
||
|
|
{
|
||
|
|
uint32_t len;
|
||
|
|
int dir = 2;
|
||
|
|
const char *ptr;
|
||
|
|
struct tcp_reassembly *assembler;
|
||
|
|
|
||
|
|
assembler = tcp_reassembly_new(1, 10, 16, 1500);
|
||
|
|
EXPECT_TRUE(assembler != NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_init(assembler, 199, 99);
|
||
|
|
|
||
|
|
/*
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* |0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|A|B|C|D|E|F|G|H|I|J|
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | | |
|
||
|
|
* +---> 90 +---> 100 +---> 110
|
||
|
|
*/
|
||
|
|
|
||
|
|
// C2S
|
||
|
|
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 100, (const char *)"abcdefghij", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 110, (const char *)"ABCDEFGHIJ", 10, 0);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "ABCDEFGHIJ", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr == NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_free(assembler);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, REPEAT1)
|
||
|
|
{
|
||
|
|
uint32_t len;
|
||
|
|
int dir = 1;
|
||
|
|
const char *ptr;
|
||
|
|
struct tcp_reassembly *assembler;
|
||
|
|
|
||
|
|
assembler = tcp_reassembly_new(1, 10, 16, 1500);
|
||
|
|
EXPECT_TRUE(assembler != NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_init(assembler, 99, 199);
|
||
|
|
|
||
|
|
/*
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* |0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | |A|B|C|D|E|F|G|H|I|J|
|
||
|
|
* | +-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | | |
|
||
|
|
* +---> 90 +---> 100 +---> 109
|
||
|
|
*/
|
||
|
|
|
||
|
|
// C2S
|
||
|
|
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 100, (const char *)"abcdefghij", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 100, (const char *)"ABCDEFGHIJ", 10, 0);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr == NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_free(assembler);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, REPEAT2)
|
||
|
|
{
|
||
|
|
uint32_t len;
|
||
|
|
int dir = 1;
|
||
|
|
const char *ptr;
|
||
|
|
struct tcp_reassembly *assembler;
|
||
|
|
|
||
|
|
assembler = tcp_reassembly_new(1, 10, 16, 1500);
|
||
|
|
EXPECT_TRUE(assembler != NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_init(assembler, 99, 199);
|
||
|
|
|
||
|
|
/*
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* |0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|G|H|I|J|
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | |a|b|c|d|e|f|g|h|i|j|
|
||
|
|
* | +-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | | |
|
||
|
|
* +---> 90 +---> 100 +---> 109
|
||
|
|
*/
|
||
|
|
|
||
|
|
// C2S
|
||
|
|
|
||
|
|
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 100, (const char *)"ABCDEFGHIJ", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 100, (const char *)"abcdefghij", 10, 0);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "ABCDEFGHIJ", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr == NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_free(assembler);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, OVERLAP)
|
||
|
|
{
|
||
|
|
uint32_t len;
|
||
|
|
int dir = 1;
|
||
|
|
const char *ptr;
|
||
|
|
struct tcp_reassembly *assembler;
|
||
|
|
|
||
|
|
assembler = tcp_reassembly_new(1, 10, 16, 1500);
|
||
|
|
EXPECT_TRUE(assembler != NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_init(assembler, 89, 199);
|
||
|
|
|
||
|
|
/*
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* |0|1|2|3|4|5|6|7|8|9|
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | +-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | |a|b|c|d|e|f|g|h|i|j|
|
||
|
|
* | +-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | | | +-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | | | |A|B|C|D|E|F|G|H|I|J|
|
||
|
|
* | | | +-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* | | | | | |
|
||
|
|
* | | | | | +---> 111
|
||
|
|
* | | | | +---> 105
|
||
|
|
* | | | +---> 102
|
||
|
|
* | | +---> 99
|
||
|
|
* | +---> 96
|
||
|
|
* +---> 90
|
||
|
|
*
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
* |0|1|2|3|4|5|6|7|8|9|e|f|g|h|i|j|E|F|G|H|I|J|
|
||
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||
|
|
*/
|
||
|
|
|
||
|
|
// C2S
|
||
|
|
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 96, (const char *)"abcdefghij", 10, 0);
|
||
|
|
tcp_reassembly_update(assembler, dir, 102, (const char *)"ABCDEFGHIJ", 10, 0);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 10);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "0123456789", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 6);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "efghij", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr != NULL);
|
||
|
|
EXPECT_TRUE(len == 6);
|
||
|
|
EXPECT_TRUE(memcmp(ptr, "EFGHIJ", len) == 0);
|
||
|
|
tcp_reassembly_consume(assembler, dir, len);
|
||
|
|
|
||
|
|
ptr = tcp_reassembly_peek(assembler, dir, &len);
|
||
|
|
EXPECT_TRUE(ptr == NULL);
|
||
|
|
|
||
|
|
tcp_reassembly_free(assembler);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, MAX_TIMEOUT)
|
||
|
|
{
|
||
|
|
// TODO
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, MAX_PACKETS)
|
||
|
|
{
|
||
|
|
// TODO
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, MAX_BYTES)
|
||
|
|
{
|
||
|
|
// TODO
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if 1
|
||
|
|
TEST(TCP_REASSEMBLY, SEQ_WRAPAROUND)
|
||
|
|
{
|
||
|
|
// TODO
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
int main(int argc, char **argv)
|
||
|
|
{
|
||
|
|
::testing::InitGoogleTest(&argc, argv);
|
||
|
|
return RUN_ALL_TESTS();
|
||
|
|
}
|