#include #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(); }