add IPv4 & IPv6 frag reassemble test case
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user