diff --git a/src/packet/test/gtest_packet_build.cpp b/src/packet/test/gtest_packet_build.cpp index d212ba0..013c2a0 100644 --- a/src/packet/test/gtest_packet_build.cpp +++ b/src/packet/test/gtest_packet_build.cpp @@ -1,10 +1,14 @@ #include #include +#include "tcp_utils.h" +#include "ipv4_utils.h" +#include "ipv6_utils.h" #include "packet_def.h" +#include "packet_dump.h" +#include "packet_layer.h" #include "packet_parse.h" #include "packet_build.h" -#include "packet_dump.h" #define PRINT_GREEN(fmt, ...) printf("\033[0;32m" fmt "\033[0m\n", ##__VA_ARGS__) #define PRINT_RED(fmt, ...) printf("\033[0;31m" fmt "\033[0m\n", ##__VA_ARGS__) @@ -120,7 +124,7 @@ unsigned char data1[] = { * -> with TCP payload */ #if 1 -TEST(PACKET_BUILD, ETH_IP4_TCP) +TEST(PACKET_BUILD_TCP, ETH_IP4_TCP) { struct packet orig_pkt; memset(&orig_pkt, 0, sizeof(orig_pkt)); @@ -142,22 +146,42 @@ TEST(PACKET_BUILD, ETH_IP4_TCP) const char *new_pkt_data = packet_get_raw_data(new_pkt); uint16_t new_pkt_len = packet_get_raw_len(new_pkt); - EXPECT_TRUE(orig_pkt_len - 6 == // trim Eth padding: 000000000000 - new_pkt_len - 12 - 5 // trim TCP options, TCP payload - ); + EXPECT_TRUE(orig_pkt_len - 6 == // trim Eth padding: 000000000000 + new_pkt_len - 12 - 5); // trim TCP options, TCP payload + struct layer layer; + PACKET_FOREACH_LAYER_INORDER(new_pkt, layer) + { + if (layer.proto == LAYER_PROTO_IPV4) + { + const struct ip *ip = (struct ip *)layer.hdr.raw; + EXPECT_TRUE(ipv4_hdr_get_total_len(ip) == 57); + break; + } + if (layer.proto == LAYER_PROTO_TCP) + { + const struct tcphdr *tcp = (struct tcphdr *)layer.hdr.raw; + EXPECT_TRUE(tcp_hdr_get_seq(tcp) == 1); + EXPECT_TRUE(tcp_hdr_get_ack(tcp) == 2); + EXPECT_TRUE(tcp_hdr_get_flags(tcp) == TH_ACK); + EXPECT_TRUE(tcp_hdr_get_hdr_len(tcp) == 32); + break; + } + } for (uint16_t i = 0; i < new_pkt_len - 12 - 5; i++) { if ((16 <= i && i <= 17) || // skip IPv4 total length (18 <= i && i <= 19) || // skip IPv4 identification i == 22 || // skip IPv4 TTL - (24 <= i && i <= 25) || // skip IPv4 checksum - (38 <= i && i <= 41) || // skip TCP seq + (24 <= i && i <= 25)) // skip IPv4 checksum + { + continue; + } + if ((38 <= i && i <= 41) || // skip TCP seq (42 <= i && i <= 45) || // skip TCP ack i == 46 || // skip TCP data offset i == 47 || // skip TCP flags (48 <= i && i <= 49) || // skip TCP window - (50 <= i && i <= 51) // skip TCP checksum - ) + (50 <= i && i <= 51)) // skip TCP checksum { continue; } @@ -236,7 +260,7 @@ unsigned char data2[] = { * -> with TCP payload */ #if 1 -TEST(PACKET_BUILD, ETH_IP4_IP6_TCP) +TEST(PACKET_BUILD_TCP, ETH_IP4_IP6_TCP) { struct packet orig_pkt; memset(&orig_pkt, 0, sizeof(orig_pkt)); @@ -259,23 +283,52 @@ TEST(PACKET_BUILD, ETH_IP4_IP6_TCP) uint16_t new_pkt_len = packet_get_raw_len(new_pkt); EXPECT_TRUE(orig_pkt_len - 12 == // trim TCP options - new_pkt_len - 5 // trim TCP payload - ); + new_pkt_len - 5); // trim TCP payload + struct layer layer; + PACKET_FOREACH_LAYER_INORDER(new_pkt, layer) + { + if (layer.proto == LAYER_PROTO_IPV4) + { + const struct ip *ip = (struct ip *)layer.hdr.raw; + EXPECT_TRUE(ipv4_hdr_get_total_len(ip) == 85); + break; + } + if (layer.proto == LAYER_PROTO_IPV6) + { + const struct ip6_hdr *ip6 = (struct ip6_hdr *)layer.hdr.raw; + EXPECT_TRUE(ipv6_hdr_get_payload_len(ip6) == 25); + break; + } + if (layer.proto == LAYER_PROTO_TCP) + { + const struct tcphdr *tcp = (struct tcphdr *)layer.hdr.raw; + EXPECT_TRUE(tcp_hdr_get_seq(tcp) == 1234); + EXPECT_TRUE(tcp_hdr_get_ack(tcp) == 2345); + EXPECT_TRUE(tcp_hdr_get_flags(tcp) == TH_ACK); + EXPECT_TRUE(tcp_hdr_get_hdr_len(tcp) == 20); + break; + } + } for (uint16_t i = 0; i < new_pkt_len - 5; i++) { if ((16 <= i && i <= 17) || // skip IPv4 total length (18 <= i && i <= 19) || // skip IPv4 identification i == 22 || // skip IPv4 TTL - (24 <= i && i <= 25) || // skip IPv4 checksum - (38 <= i && i <= 39) || // skip IPv6 payload length - i == 41 || // skip IPv6 hop limit - (78 <= i && i <= 81) || // skip TCP seq + (24 <= i && i <= 25)) // skip IPv4 checksum + { + continue; + } + if ((38 <= i && i <= 39) || // skip IPv6 payload length + i == 41) // skip IPv6 hop limit + { + continue; + } + if ((78 <= i && i <= 81) || // skip TCP seq (82 <= i && i <= 85) || // skip TCP ack i == 86 || // skip TCP data offset i == 87 || // skip TCP flags (88 <= i && i <= 89) || // skip TCP window - (90 <= i && i <= 91) // skip TCP checksum - ) + (90 <= i && i <= 91)) // skip TCP checksum { continue; }