Refactor TCP reassembly, the session knows where the TCP segment comes from: raw packet or tcp segment queue

This commit is contained in:
luwenpeng
2024-04-02 16:21:39 +08:00
parent a509f0ce3b
commit e8e60cee6d
25 changed files with 678 additions and 1419 deletions

View File

@@ -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