add IPv4 & IPv6 frag reassemble test case

This commit is contained in:
luwenpeng
2024-02-23 18:19:52 +08:00
parent 5cd0571b4d
commit 2e748e0821
12 changed files with 1462 additions and 328 deletions

View File

@@ -1,17 +1,4 @@
#include <gtest/gtest.h>
#include "timestamp.h"
#include "udp_utils.h"
#include "ipv6_utils.h"
#include "packet_helpers.h"
#include "ip_reassemble.h"
struct ip_reassemble_config config = {
.enable = true,
.timeout = 1000,
.bucket_entries = 16,
.bucket_num = 8,
};
#include "gtest_utils.h"
/*
* Frame 3: 1510 bytes on wire (12080 bits), 1510 bytes captured (12080 bits)
@@ -615,40 +602,77 @@ unsigned char expect[] = {
0x7b, 0x0d, 0x49, 0xe1, 0x76, 0x34, 0x07, 0xf7, 0x9e, 0xe5, 0xb7, 0x66, 0x39, 0xb1, 0xb0, 0xa0, 0x1a, 0x44, 0x90, 0xce, 0x07, 0x03, 0xf2, 0x1b, 0x0e, 0xc6,
0x17, 0xed, 0xd8, 0x4f, 0x4f};
#if 1
TEST(IPV6_REASSEMBLE, NORMAL)
{
struct packet pkt;
struct packet *new_pkt;
const struct layer_record *layer;
struct ip_reassemble_manager *mgr;
struct ip_reassemble_config config = {
.enable = true,
.timeout = 1,
.bucket_entries = 16,
.bucket_num = 8,
};
timestamp_update();
mgr = ip_reassemble_manager_create(&config);
EXPECT_TRUE(mgr != NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
0, 0, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag1
packet_parse(&pkt, (const char *)frag1, sizeof(frag1));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
1, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag2
packet_parse(&pkt, (const char *)frag2, sizeof(frag2));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
2, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag3
packet_parse(&pkt, (const char *)frag3, sizeof(frag3));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
3, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag4
packet_parse(&pkt, (const char *)frag4, sizeof(frag4));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
4, 1, 1, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// check packet
packet_print(new_pkt);
// packet_print(new_pkt);
EXPECT_TRUE(new_pkt->data_len == 14 /* ETH */ + 40 /* IPv6 */ + 8 /* UDP */ + 5379 /* DATA */);
EXPECT_TRUE(new_pkt->data_len == sizeof(expect));
EXPECT_TRUE(memcmp(new_pkt->data_ptr, expect, new_pkt->data_len) == 0);
@@ -687,26 +711,458 @@ TEST(IPV6_REASSEMBLE, NORMAL)
ip_reassemble_manager_destory(mgr);
}
#endif
#if 1
TEST(IPV6_REASSEMBLE, EXPIRE)
{
// TODO
}
struct packet pkt;
struct packet *new_pkt;
struct ip_reassemble_manager *mgr;
struct ip_reassemble_config config = {
.enable = true,
.timeout = 1,
.bucket_entries = 16,
.bucket_num = 8,
};
timestamp_update();
mgr = ip_reassemble_manager_create(&config);
EXPECT_TRUE(mgr != NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
0, 0, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag1
packet_parse(&pkt, (const char *)frag1, sizeof(frag1));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
1, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// sleep 1
sleep(1);
timestamp_update();
// frag2
packet_parse(&pkt, (const char *)frag2, sizeof(frag2));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
2, 2, 1, 1, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// free packet
packet_free(new_pkt);
ip_reassemble_manager_destory(mgr);
}
#endif
#if 1
TEST(IPV6_REASSEMBLE, DUP_FIRST_FRAG)
{
struct packet pkt;
struct packet *new_pkt;
const struct layer_record *layer;
struct ip_reassemble_manager *mgr;
struct ip_reassemble_config config = {
.enable = true,
.timeout = 1,
.bucket_entries = 16,
.bucket_num = 8,
};
timestamp_update();
mgr = ip_reassemble_manager_create(&config);
EXPECT_TRUE(mgr != NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
0, 0, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag1
packet_parse(&pkt, (const char *)frag1, sizeof(frag1));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
1, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag1
packet_parse(&pkt, (const char *)frag1, sizeof(frag1));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
2, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 1, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag2
packet_parse(&pkt, (const char *)frag2, sizeof(frag2));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
3, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 1, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag3
packet_parse(&pkt, (const char *)frag3, sizeof(frag3));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
4, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 1, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag4
packet_parse(&pkt, (const char *)frag4, sizeof(frag4));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
5, 1, 1, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 1, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// check packet
// packet_print(new_pkt);
EXPECT_TRUE(new_pkt->data_len == 14 /* ETH */ + 40 /* IPv6 */ + 8 /* UDP */ + 5379 /* DATA */);
EXPECT_TRUE(new_pkt->data_len == sizeof(expect));
EXPECT_TRUE(memcmp(new_pkt->data_ptr, expect, new_pkt->data_len) == 0);
// check IPv6
layer = packet_get_innermost_layer(new_pkt, LAYER_TYPE_IPV6);
EXPECT_TRUE(layer);
struct ip6_hdr *hdr = (struct ip6_hdr *)layer->hdr_ptr;
EXPECT_TRUE(ipv6_hdr_get_version(hdr) == 6);
EXPECT_TRUE(ipv6_hdr_get_traffic_class(hdr) == 0);
EXPECT_TRUE(ipv6_hdr_get_flow_label(hdr) == 0x21289);
EXPECT_TRUE(ipv6_hdr_get_payload_len(hdr) == 5387);
EXPECT_TRUE(ipv6_hdr_get_next_header(hdr) == 17); // UDP
EXPECT_TRUE(ipv6_hdr_get_hop_limit(hdr) == 64);
char src_str[INET6_ADDRSTRLEN];
char dst_str[INET6_ADDRSTRLEN];
struct in6_addr src_addr = ipv6_hdr_get_src_in6_addr(hdr);
struct in6_addr dst_addr = ipv6_hdr_get_dst_in6_addr(hdr);
inet_ntop(AF_INET6, &src_addr, src_str, INET6_ADDRSTRLEN);
inet_ntop(AF_INET6, &dst_addr, dst_str, INET6_ADDRSTRLEN);
EXPECT_TRUE(strcmp(src_str, "2607:f010:3f9::1001") == 0);
EXPECT_TRUE(strcmp(dst_str, "2607:f010:3f9::11:0") == 0);
EXPECT_TRUE(ipv6_hdr_get_frag_ext(hdr) == NULL);
// check UDP
layer = packet_get_innermost_layer(new_pkt, LAYER_TYPE_UDP);
EXPECT_TRUE(layer);
struct udphdr *udp_hdr = (struct udphdr *)layer->hdr_ptr;
EXPECT_TRUE(udp_hdr_get_src_port(udp_hdr) == 6363);
EXPECT_TRUE(udp_hdr_get_dst_port(udp_hdr) == 6363);
EXPECT_TRUE(udp_hdr_get_total_len(udp_hdr) == 5387);
EXPECT_TRUE(udp_hdr_get_checksum(udp_hdr) == 0x7916);
// free packet
packet_free(new_pkt);
ip_reassemble_manager_destory(mgr);
}
#endif
#if 1
TEST(IPV6_REASSEMBLE, DUP_LAST_FRAG)
{
struct packet pkt;
struct packet *new_pkt;
const struct layer_record *layer;
struct ip_reassemble_manager *mgr;
struct ip_reassemble_config config = {
.enable = true,
.timeout = 1,
.bucket_entries = 16,
.bucket_num = 8,
};
timestamp_update();
mgr = ip_reassemble_manager_create(&config);
EXPECT_TRUE(mgr != NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
0, 0, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag4
packet_parse(&pkt, (const char *)frag4, sizeof(frag4));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
1, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag4
packet_parse(&pkt, (const char *)frag4, sizeof(frag4));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
2, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 1); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag3
packet_parse(&pkt, (const char *)frag3, sizeof(frag3));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
3, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 1); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag2
packet_parse(&pkt, (const char *)frag2, sizeof(frag2));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
4, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 1); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag1
packet_parse(&pkt, (const char *)frag1, sizeof(frag1));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
5, 1, 1, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 1); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// check packet
// packet_print(new_pkt);
EXPECT_TRUE(new_pkt->data_len == 14 /* ETH */ + 40 /* IPv6 */ + 8 /* UDP */ + 5379 /* DATA */);
EXPECT_TRUE(new_pkt->data_len == sizeof(expect));
EXPECT_TRUE(memcmp(new_pkt->data_ptr, expect, new_pkt->data_len) == 0);
// check IPv6
layer = packet_get_innermost_layer(new_pkt, LAYER_TYPE_IPV6);
EXPECT_TRUE(layer);
struct ip6_hdr *hdr = (struct ip6_hdr *)layer->hdr_ptr;
EXPECT_TRUE(ipv6_hdr_get_version(hdr) == 6);
EXPECT_TRUE(ipv6_hdr_get_traffic_class(hdr) == 0);
EXPECT_TRUE(ipv6_hdr_get_flow_label(hdr) == 0x21289);
EXPECT_TRUE(ipv6_hdr_get_payload_len(hdr) == 5387);
EXPECT_TRUE(ipv6_hdr_get_next_header(hdr) == 17); // UDP
EXPECT_TRUE(ipv6_hdr_get_hop_limit(hdr) == 64);
char src_str[INET6_ADDRSTRLEN];
char dst_str[INET6_ADDRSTRLEN];
struct in6_addr src_addr = ipv6_hdr_get_src_in6_addr(hdr);
struct in6_addr dst_addr = ipv6_hdr_get_dst_in6_addr(hdr);
inet_ntop(AF_INET6, &src_addr, src_str, INET6_ADDRSTRLEN);
inet_ntop(AF_INET6, &dst_addr, dst_str, INET6_ADDRSTRLEN);
EXPECT_TRUE(strcmp(src_str, "2607:f010:3f9::1001") == 0);
EXPECT_TRUE(strcmp(dst_str, "2607:f010:3f9::11:0") == 0);
EXPECT_TRUE(ipv6_hdr_get_frag_ext(hdr) == NULL);
// check UDP
layer = packet_get_innermost_layer(new_pkt, LAYER_TYPE_UDP);
EXPECT_TRUE(layer);
struct udphdr *udp_hdr = (struct udphdr *)layer->hdr_ptr;
EXPECT_TRUE(udp_hdr_get_src_port(udp_hdr) == 6363);
EXPECT_TRUE(udp_hdr_get_dst_port(udp_hdr) == 6363);
EXPECT_TRUE(udp_hdr_get_total_len(udp_hdr) == 5387);
EXPECT_TRUE(udp_hdr_get_checksum(udp_hdr) == 0x7916);
// free packet
packet_free(new_pkt);
ip_reassemble_manager_destory(mgr);
}
#endif
#if 1
TEST(IPV6_REASSEMBLE, FULL)
{
// TODO
}
struct packet pkt;
struct packet *new_pkt;
struct in6_addr src_addr;
struct ip_reassemble_manager *mgr;
struct ip_reassemble_config config = {
.enable = true,
.timeout = 1,
.bucket_entries = 1,
.bucket_num = 1,
};
TEST(IPV6_REASSEMBLE, HOLE)
{
// TODO
}
timestamp_update();
TEST(IPV6_REASSEMBLE, NESTED)
{
// TODO
mgr = ip_reassemble_manager_create(&config);
EXPECT_TRUE(mgr != NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
0, 0, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
char dup_frag[sizeof(frag1)] = {0};
memcpy(dup_frag, frag1, sizeof(frag1));
packet_parse(&pkt, (const char *)dup_frag, sizeof(dup_frag));
// flow1
memset(&src_addr, 1, sizeof(src_addr));
packet_set_ipv6_src_addr(&pkt, src_addr);
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
1, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// flow2
memset(&src_addr, 2, sizeof(src_addr));
packet_set_ipv6_src_addr(&pkt, src_addr);
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
2, 2, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// flow3
memset(&src_addr, 3, sizeof(src_addr));
packet_set_ipv6_src_addr(&pkt, src_addr);
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
3, 2, 0, 0, // ip6: find, add, del, timeout
1, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// free packet
packet_free(new_pkt);
ip_reassemble_manager_destory(mgr);
}
#endif
#if 1
TEST(IPV6_REASSEMBLE, OVERLAP)
{
struct packet pkt;
struct packet *new_pkt;
struct ip_reassemble_manager *mgr;
struct ip_reassemble_config config = {
.enable = true,
.timeout = 1,
.bucket_entries = 16,
.bucket_num = 8,
};
timestamp_update();
mgr = ip_reassemble_manager_create(&config);
EXPECT_TRUE(mgr != NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
0, 0, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag1
packet_parse(&pkt, (const char *)frag1, sizeof(frag1));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
1, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag2
packet_parse(&pkt, (const char *)frag2, sizeof(frag2));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
2, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag3 -- overwrite frag offset
char dup_frag[sizeof(frag3)] = {0};
memcpy(dup_frag, frag3, sizeof(frag3));
packet_parse(&pkt, (const char *)dup_frag, sizeof(dup_frag));
packet_set_ipv6_frag_offset(&pkt, 2048);
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
3, 1, 0, 0, // ip6: find, add, del, timeout
0, 0, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// frag4
packet_parse(&pkt, (const char *)frag4, sizeof(frag4));
new_pkt = ip_reassemble_packet(mgr, &pkt);
EXPECT_TRUE(new_pkt == NULL);
// ip_reassemble_manager_print_stat(mgr);
check_stat(ip_reassemble_manager_get_stat(mgr),
0, 0, 0, 0, // ip4: find, add, del, timeout
0, 0, 0, 0, 0, 0, // ip4: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
4, 1, 1, 0, // ip6: find, add, del, timeout
0, 1, 0, 0, 0, 0); // ip6: nospace, overlap, many frag, invalid length, dup first frag, dup last frag
// free packet
packet_free(new_pkt);
ip_reassemble_manager_destory(mgr);
}
#endif
int main(int argc, char **argv)
{