Refactor TCP reassembly, the session knows where the TCP segment comes from: raw packet or tcp segment queue
This commit is contained in:
@@ -42,8 +42,7 @@ struct session_manager_options opts = {
|
||||
// TCP Reassembly
|
||||
.tcp_reassembly_enable = 1,
|
||||
.tcp_reassembly_max_timeout = 60000,
|
||||
.tcp_reassembly_max_segments = 0,
|
||||
.tcp_reassembly_max_bytes = 0,
|
||||
.tcp_reassembly_max_segments = 16,
|
||||
};
|
||||
|
||||
static void hex_dump(const char *payload, uint32_t len)
|
||||
@@ -63,8 +62,7 @@ static void hex_dump(const char *payload, uint32_t len)
|
||||
#if 1
|
||||
TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
{
|
||||
uint32_t len = 0;
|
||||
const char *payload = NULL;
|
||||
struct tcp_segment *seg;
|
||||
struct packet pkt;
|
||||
struct session *sess = NULL;
|
||||
struct session_manager *mgr = NULL;
|
||||
@@ -83,9 +81,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
sess = session_manager_new_session(mgr, &pkt, 1);
|
||||
EXPECT_TRUE(sess);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload == NULL);
|
||||
EXPECT_TRUE(len == 0);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg == NULL);
|
||||
|
||||
// C2S ACK Packet
|
||||
printf("\n=> Packet Parse: TCP C2S ACK packet\n");
|
||||
@@ -98,9 +95,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
// update session
|
||||
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 2) == 0);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload == NULL);
|
||||
EXPECT_TRUE(len == 0);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg == NULL);
|
||||
|
||||
// C2S Data Packet 2222
|
||||
printf("\n=> Packet Parse: TCP C2S Data packet\n");
|
||||
@@ -113,9 +109,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
// update session
|
||||
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 3) == 0);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload == NULL);
|
||||
EXPECT_TRUE(len == 0);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg == NULL);
|
||||
|
||||
// C2S Data Packet 3333
|
||||
printf("\n=> Packet Parse: TCP C2S Data packet\n");
|
||||
@@ -128,9 +123,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
// update session
|
||||
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 4) == 0);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload == NULL);
|
||||
EXPECT_TRUE(len == 0);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg == NULL);
|
||||
|
||||
// C2S Data Packet 4444
|
||||
printf("\n=> Packet Parse: TCP C2S Data packet\n");
|
||||
@@ -143,9 +137,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
// update session
|
||||
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 5) == 0);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload == NULL);
|
||||
EXPECT_TRUE(len == 0);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg == NULL);
|
||||
|
||||
// C2S Data Packet 5555
|
||||
printf("\n=> Packet Parse: TCP C2S Data packet\n");
|
||||
@@ -158,9 +151,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
// update session
|
||||
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 6) == 0);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload == NULL);
|
||||
EXPECT_TRUE(len == 0);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg == NULL);
|
||||
|
||||
// C2S Data Packet 1111
|
||||
printf("\n=> Packet Parse: TCP C2S Data packet\n");
|
||||
@@ -202,40 +194,40 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35,
|
||||
0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x0a};
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload != NULL);
|
||||
EXPECT_TRUE(len == sizeof(payload1));
|
||||
EXPECT_TRUE(memcmp((void *)payload, payload1, sizeof(payload1)) == 0);
|
||||
hex_dump(payload, len);
|
||||
tcp_data_dequeue(sess, len);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg != NULL);
|
||||
EXPECT_TRUE(seg->len == sizeof(payload1));
|
||||
EXPECT_TRUE(memcmp((void *)seg->data, payload1, sizeof(payload1)) == 0);
|
||||
hex_dump((const char *)seg->data, seg->len);
|
||||
session_free_tcp_segment(sess, seg);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload != NULL);
|
||||
EXPECT_TRUE(len == sizeof(payload2));
|
||||
EXPECT_TRUE(memcmp((void *)payload, payload2, sizeof(payload2)) == 0);
|
||||
hex_dump(payload, len);
|
||||
tcp_data_dequeue(sess, len);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg != NULL);
|
||||
EXPECT_TRUE(seg->len == sizeof(payload2));
|
||||
EXPECT_TRUE(memcmp((void *)seg->data, payload2, sizeof(payload2)) == 0);
|
||||
hex_dump((const char *)seg->data, seg->len);
|
||||
session_free_tcp_segment(sess, seg);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload != NULL);
|
||||
EXPECT_TRUE(len == sizeof(payload3));
|
||||
EXPECT_TRUE(memcmp((void *)payload, payload3, sizeof(payload3)) == 0);
|
||||
hex_dump(payload, len);
|
||||
tcp_data_dequeue(sess, len);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg != NULL);
|
||||
EXPECT_TRUE(seg->len == sizeof(payload3));
|
||||
EXPECT_TRUE(memcmp((void *)seg->data, payload3, sizeof(payload3)) == 0);
|
||||
hex_dump((const char *)seg->data, seg->len);
|
||||
session_free_tcp_segment(sess, seg);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload != NULL);
|
||||
EXPECT_TRUE(len == sizeof(payload4));
|
||||
EXPECT_TRUE(memcmp((void *)payload, payload4, sizeof(payload4)) == 0);
|
||||
hex_dump(payload, len);
|
||||
tcp_data_dequeue(sess, len);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg != NULL);
|
||||
EXPECT_TRUE(seg->len == sizeof(payload4));
|
||||
EXPECT_TRUE(memcmp((void *)seg->data, payload4, sizeof(payload4)) == 0);
|
||||
hex_dump((const char *)seg->data, seg->len);
|
||||
session_free_tcp_segment(sess, seg);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload != NULL);
|
||||
EXPECT_TRUE(len == sizeof(payload5));
|
||||
EXPECT_TRUE(memcmp((void *)payload, payload5, sizeof(payload5)) == 0);
|
||||
hex_dump(payload, len);
|
||||
tcp_data_dequeue(sess, len);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg != NULL);
|
||||
EXPECT_TRUE(seg->len == sizeof(payload5));
|
||||
EXPECT_TRUE(memcmp((void *)seg->data, payload5, sizeof(payload5)) == 0);
|
||||
hex_dump((const char *)seg->data, seg->len);
|
||||
session_free_tcp_segment(sess, seg);
|
||||
|
||||
// expire session
|
||||
EXPECT_TRUE(session_manager_get_expired_session(mgr, 7 + opts.tcp_data_timeout) == NULL); // active -> closing
|
||||
@@ -254,8 +246,7 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
|
||||
#if 1
|
||||
TEST(SESS_MGR_TCP_REASSEMBLY, SEQ_WRAPAROUND)
|
||||
{
|
||||
uint32_t len = 0;
|
||||
const char *payload = NULL;
|
||||
struct tcp_segment *seg;
|
||||
struct packet pkt;
|
||||
struct session *sess = NULL;
|
||||
struct session_manager *mgr = NULL;
|
||||
@@ -274,9 +265,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, SEQ_WRAPAROUND)
|
||||
sess = session_manager_new_session(mgr, &pkt, 1);
|
||||
EXPECT_TRUE(sess);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload == NULL);
|
||||
EXPECT_TRUE(len == 0);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg == NULL);
|
||||
|
||||
// C2S ACK Packet
|
||||
printf("\n=> Packet Parse: TCP C2S ACK packet\n");
|
||||
@@ -289,9 +279,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, SEQ_WRAPAROUND)
|
||||
// update session
|
||||
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 2) == 0);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload == NULL);
|
||||
EXPECT_TRUE(len == 0);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg == NULL);
|
||||
|
||||
// C2S Data Packet
|
||||
printf("\n=> Packet Parse: TCP C2S Data packet\n");
|
||||
@@ -304,12 +293,12 @@ TEST(SESS_MGR_TCP_REASSEMBLY, SEQ_WRAPAROUND)
|
||||
// update session
|
||||
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 3) == 0);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload != NULL);
|
||||
EXPECT_TRUE(len == sizeof(tcp_seq_wraparound_pkt3_payload));
|
||||
EXPECT_TRUE(memcmp((void *)payload, tcp_seq_wraparound_pkt3_payload, sizeof(tcp_seq_wraparound_pkt3_payload)) == 0);
|
||||
hex_dump(payload, len);
|
||||
tcp_data_dequeue(sess, len);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg != NULL);
|
||||
EXPECT_TRUE(seg->len == sizeof(tcp_seq_wraparound_pkt3_payload));
|
||||
EXPECT_TRUE(memcmp((void *)seg->data, tcp_seq_wraparound_pkt3_payload, sizeof(tcp_seq_wraparound_pkt3_payload)) == 0);
|
||||
hex_dump((const char *)seg->data, seg->len);
|
||||
session_free_tcp_segment(sess, seg);
|
||||
|
||||
// C2S Data Packet
|
||||
printf("\n=> Packet Parse: TCP C2S Data packet\n");
|
||||
@@ -322,12 +311,12 @@ TEST(SESS_MGR_TCP_REASSEMBLY, SEQ_WRAPAROUND)
|
||||
// update session
|
||||
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 4) == 0);
|
||||
|
||||
payload = tcp_data_peek(sess, &len);
|
||||
EXPECT_TRUE(payload != NULL);
|
||||
EXPECT_TRUE(len == sizeof(tcp_seq_wraparound_pkt4_payload));
|
||||
EXPECT_TRUE(memcmp((void *)payload, tcp_seq_wraparound_pkt4_payload, sizeof(tcp_seq_wraparound_pkt4_payload)) == 0);
|
||||
hex_dump(payload, len);
|
||||
tcp_data_dequeue(sess, len);
|
||||
seg = session_get_tcp_segment(sess);
|
||||
EXPECT_TRUE(seg != NULL);
|
||||
EXPECT_TRUE(seg->len == sizeof(tcp_seq_wraparound_pkt4_payload));
|
||||
EXPECT_TRUE(memcmp((void *)seg->data, tcp_seq_wraparound_pkt4_payload, sizeof(tcp_seq_wraparound_pkt4_payload)) == 0);
|
||||
hex_dump((const char *)seg->data, seg->len);
|
||||
session_free_tcp_segment(sess, seg);
|
||||
|
||||
// expire session
|
||||
EXPECT_TRUE(session_manager_get_expired_session(mgr, 4 + opts.tcp_data_timeout) == NULL); // active -> closing
|
||||
|
||||
Reference in New Issue
Block a user