summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2024-07-30 18:21:51 +0800
committerluwenpeng <[email protected]>2024-07-30 18:21:51 +0800
commit18153550d978dac0d6ea40ecd8ba2528a7dfd4aa (patch)
treea55705416b0ba8ff1dbdad77684a058b573f9dfc
parent1f09f43f520bf75efe2e2b264e15bd0dff80c091 (diff)
test: add imitate_udp_packet test case (UDP over GER, with GRE payload length, with UDP payload)
-rw-r--r--src/packet/test/gtest_packet_craft.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/packet/test/gtest_packet_craft.cpp b/src/packet/test/gtest_packet_craft.cpp
index 1dc1047..f2872f6 100644
--- a/src/packet/test/gtest_packet_craft.cpp
+++ b/src/packet/test/gtest_packet_craft.cpp
@@ -783,6 +783,237 @@ TEST(PACKET_CRAFT_TCP, ETH_IP4_GRE_IP6_TCP)
}
#endif
+/******************************************************************************
+ * [Protocols in frame: eth:ethertype:vlan:ethertype:ipv6:ip:gre:ppp:ip:udp:dns]
+ ******************************************************************************
+ *
+ * Frame 1: 197 bytes on wire (1576 bits), 197 bytes captured (1576 bits)
+ * Ethernet II, Src: JuniperNetwo_f2:61:3d (00:12:1e:f2:61:3d), Dst: c5:00:00:00:82:c4 (c5:00:00:00:82:c4)
+ * Destination: c5:00:00:00:82:c4 (c5:00:00:00:82:c4)
+ * Source: JuniperNetwo_f2:61:3d (00:12:1e:f2:61:3d)
+ * Type: 802.1Q Virtual LAN (0x8100)
+ * 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 100
+ * 000. .... .... .... = Priority: Best Effort (default) (0)
+ * ...0 .... .... .... = DEI: Ineligible
+ * .... 0000 0110 0100 = ID: 100
+ * Type: IPv6 (0x86dd)
+ * Internet Protocol Version 6, Src: 2402:f000:1:8e01::5555, Dst: 2607:fcd0:100:2300::b108:2a6b
+ * 0110 .... = Version: 6
+ * .... 0000 0000 .... .... .... .... .... = Traffic Class: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * .... 0000 00.. .... .... .... .... .... = Differentiated Services Codepoint: Default (0)
+ * .... .... ..00 .... .... .... .... .... = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * .... 0000 0000 0000 0000 0000 = Flow Label: 0x00000
+ * Payload Length: 139
+ * Next Header: IPIP (4)
+ * Hop Limit: 246
+ * Source Address: 2402:f000:1:8e01::5555
+ * Destination Address: 2607:fcd0:100:2300::b108:2a6b
+ * Internet Protocol Version 4, Src: 16.0.0.200, Dst: 192.52.166.154
+ * 0100 .... = Version: 4
+ * .... 0101 = Header Length: 20 bytes (5)
+ * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * 0000 00.. = Differentiated Services Codepoint: Default (0)
+ * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * Total Length: 139
+ * Identification: 0x8caf (36015)
+ * 000. .... = Flags: 0x0
+ * 0... .... = Reserved bit: Not set
+ * .0.. .... = Don't fragment: Not set
+ * ..0. .... = More fragments: Not set
+ * ...0 0000 0000 0000 = Fragment Offset: 0
+ * Time to Live: 64
+ * Protocol: Generic Routing Encapsulation (47)
+ * Header Checksum: 0x75fe [correct]
+ * [Header checksum status: Good]
+ * [Calculated Checksum: 0x75fe]
+ * Source Address: 16.0.0.200
+ * Destination Address: 192.52.166.154
+ * Generic Routing Encapsulation (PPP)
+ * Flags and Version: 0x3081
+ * 0... .... .... .... = Checksum Bit: No
+ * .0.. .... .... .... = Routing Bit: No
+ * ..1. .... .... .... = Key Bit: Yes
+ * ...1 .... .... .... = Sequence Number Bit: Yes
+ * .... 0... .... .... = Strict Source Route Bit: No
+ * .... .000 .... .... = Recursion control: 0
+ * .... .... 1... .... = Acknowledgment: Yes
+ * .... .... .000 0... = Flags (Reserved): 0
+ * .... .... .... .001 = Version: Enhanced GRE (1)
+ * Protocol Type: PPP (0x880b)
+ * Payload Length: 103
+ * Call ID: 6016
+ * Sequence Number: 430001
+ * Acknowledgment Number: 539254
+ * Point-to-Point Protocol
+ * Address: 0xff
+ * Control: 0x03
+ * Protocol: Internet Protocol version 4 (0x0021)
+ * Internet Protocol Version 4, Src: 172.16.44.3, Dst: 8.8.8.8
+ * 0100 .... = Version: 4
+ * .... 0101 = Header Length: 20 bytes (5)
+ * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * 0000 00.. = Differentiated Services Codepoint: Default (0)
+ * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * Total Length: 99
+ * Identification: 0x0000 (0)
+ * 010. .... = Flags: 0x2, Don't fragment
+ * 0... .... = Reserved bit: Not set
+ * .1.. .... = Don't fragment: Set
+ * ..0. .... = More fragments: Not set
+ * ...0 0000 0000 0000 = Fragment Offset: 0
+ * Time to Live: 60
+ * Protocol: UDP (17)
+ * Header Checksum: 0x5667 [correct]
+ * [Header checksum status: Good]
+ * [Calculated Checksum: 0x5667]
+ * Source Address: 172.16.44.3
+ * Destination Address: 8.8.8.8
+ * User Datagram Protocol, Src Port: 40768, Dst Port: 53
+ * Source Port: 40768
+ * Destination Port: 53
+ * Length: 79
+ * Checksum: 0x2d23 [correct]
+ * [Calculated Checksum: 0x2d23]
+ * [Checksum Status: Good]
+ * [Stream index: 0]
+ * [Timestamps]
+ * [Time since first frame: 0.000000000 seconds]
+ * [Time since previous frame: 0.000000000 seconds]
+ * UDP payload (71 bytes)
+ * Domain Name System (query)
+ * Transaction ID: 0xa62c
+ * Flags: 0x0100 Standard query
+ * 0... .... .... .... = Response: Message is a query
+ * .000 0... .... .... = Opcode: Standard query (0)
+ * .... ..0. .... .... = Truncated: Message is not truncated
+ * .... ...1 .... .... = Recursion desired: Do query recursively
+ * .... .... .0.. .... = Z: reserved (0)
+ * .... .... ...0 .... = Non-authenticated data: Unacceptable
+ * Questions: 1
+ * Answer RRs: 0
+ * Authority RRs: 0
+ * Additional RRs: 0
+ * Queries
+ * xqt-detect-mode2-97712e88-167a-45b9-93ee-913140e76678: type AAAA, class IN
+ * Name: xqt-detect-mode2-97712e88-167a-45b9-93ee-913140e76678
+ * [Name Length: 53]
+ * [Label Count: 1]
+ * Type: AAAA (28) (IP6 Address)
+ * Class: IN (0x0001)
+ * [Response In: 2]
+ */
+
+unsigned char data5[] = {
+ 0xc5, 0x00, 0x00, 0x00, 0x82, 0xc4, 0x00, 0x12, 0x1e, 0xf2, 0x61, 0x3d, 0x81, 0x00, 0x00, 0x64, 0x86, 0xdd, 0x60, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x04, 0xf6,
+ 0x24, 0x02, 0xf0, 0x00, 0x00, 0x01, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x26, 0x07, 0xfc, 0xd0, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xb1, 0x08, 0x2a, 0x6b, 0x45, 0x00, 0x00, 0x8b, 0x8c, 0xaf, 0x00, 0x00, 0x40, 0x2f, 0x75, 0xfe, 0x10, 0x00, 0x00, 0xc8, 0xc0, 0x34, 0xa6, 0x9a,
+ 0x30, 0x81, 0x88, 0x0b, 0x00, 0x67, 0x17, 0x80, 0x00, 0x06, 0x8f, 0xb1, 0x00, 0x08, 0x3a, 0x76, 0xff, 0x03, 0x00, 0x21, 0x45, 0x00, 0x00, 0x63, 0x00, 0x00,
+ 0x40, 0x00, 0x3c, 0x11, 0x56, 0x67, 0xac, 0x10, 0x2c, 0x03, 0x08, 0x08, 0x08, 0x08, 0x9f, 0x40, 0x00, 0x35, 0x00, 0x4f, 0x2d, 0x23, 0xa6, 0x2c, 0x01, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x78, 0x71, 0x74, 0x2d, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x32, 0x2d,
+ 0x39, 0x37, 0x37, 0x31, 0x32, 0x65, 0x38, 0x38, 0x2d, 0x31, 0x36, 0x37, 0x61, 0x2d, 0x34, 0x35, 0x62, 0x39, 0x2d, 0x39, 0x33, 0x65, 0x65, 0x2d, 0x39, 0x31,
+ 0x33, 0x31, 0x34, 0x30, 0x65, 0x37, 0x36, 0x36, 0x37, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x01};
+
+/*
+ * craft_udp_packet()
+ * -> ETH->VLAN->IPv6->IPv4->GRE->PPP->IPv4->UDP->DNS
+ * -> with UDP payload
+ * -> with GRE payload length
+ */
+#if 1
+TEST(PACKET_CRAFT_UDP, ETH_VLAN_IPv6_IPv4_GRE_PPP_IPv4_UDP_DNS)
+{
+ struct packet orig_pkt;
+ memset(&orig_pkt, 0, sizeof(orig_pkt));
+ packet_parse(&orig_pkt, (const char *)data5, sizeof(data5));
+ PRINT_GREEN("origin packet:");
+ packet_print(&orig_pkt);
+
+ struct packet *new_pkt = craft_udp_packet(&orig_pkt, "Hello", 5);
+ EXPECT_TRUE(new_pkt != nullptr);
+ PRINT_GREEN("new packet:");
+ packet_print(new_pkt);
+
+ packet_dump_hex(new_pkt, STDOUT_FILENO);
+ packet_dump_pcap(new_pkt, "craft-eth-vlan-ipv6-ipv4-gre-ppp-ipv4-udp-dns.pcap");
+
+ const char *orig_pkt_data = packet_get_raw_data(&orig_pkt);
+ uint16_t orig_pkt_len = packet_get_raw_len(&orig_pkt);
+
+ 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 - 71 == // trim DNS payload
+ new_pkt_len - 5); // trim UDP payload
+ int count = 0;
+ struct layer layer;
+ PACKET_FOREACH_LAYER_INORDER(new_pkt, layer)
+ {
+ if (layer.proto == LAYER_PROTO_IPV6)
+ {
+ const struct ip6_hdr *ip6 = (const struct ip6_hdr *)layer.hdr.raw;
+ EXPECT_TRUE(ip6_hdr_get_payload_len(ip6) == 73);
+ }
+ if (layer.proto == LAYER_PROTO_IPV4)
+ {
+ const struct ip *ip = (const struct ip *)layer.hdr.raw;
+ if (count == 0)
+ {
+ EXPECT_TRUE(ip4_hdr_get_total_len(ip) == 73);
+ EXPECT_TRUE(ip4_hdr_get_checksum(ip) == 0x7640);
+ }
+ else
+ {
+ EXPECT_TRUE(ip4_hdr_get_total_len(ip) == 33);
+ EXPECT_TRUE(ip4_hdr_get_checksum(ip) == 0x56a9);
+ }
+ count++;
+ }
+ if (layer.proto == LAYER_PROTO_GRE)
+ {
+ const struct gre1_hdr *gre = (const struct gre1_hdr *)layer.hdr.raw;
+ EXPECT_TRUE(gre1_hdr_get_version(gre) == 1);
+ EXPECT_TRUE(gre1_hdr_get_payload_length(gre) == 37);
+ }
+ if (layer.proto == LAYER_PROTO_UDP)
+ {
+ const struct udphdr *udp = (const struct udphdr *)layer.hdr.raw;
+ EXPECT_TRUE(udp_hdr_get_total_len(udp) == 13);
+ EXPECT_TRUE(udp_hdr_get_checksum(udp) == 0x5469);
+ }
+ }
+
+ for (uint16_t i = 0; i < new_pkt_len - 5; i++)
+ {
+ if (22 <= i && i <= 23) /// skip IPv6 payload length
+ {
+ continue;
+ }
+ if ((60 <= i && i <= 61) || // skip IPv4 total length
+ (68 <= i && i <= 69)) // skip IPv4 checksum
+ {
+ continue;
+ }
+ if ((82 <= i && i <= 83)) // skip GRE payload length
+ {
+ continue;
+ }
+ if ((100 <= i && i <= 101) || // skip IPv4 total length
+ (108 <= i && i <= 109)) // skip IPv4 checksum
+ {
+ continue;
+ }
+ if ((122 <= i && i <= 123) || // skip UDP total length
+ (124 <= i && i <= 125)) // skip UDP checksum
+ {
+ continue;
+ }
+
+ printf(("idx: %d, orig: %02x, new: %02x\n"), i, orig_pkt_data[i], new_pkt_data[i]);
+ EXPECT_TRUE(orig_pkt_data[i] == new_pkt_data[i]);
+ }
+}
+#endif
+
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);