When the packet length is greater than the IP expected length, the padding data at the end of the frame will be trimmed.

This commit is contained in:
luwenpeng
2024-05-24 19:10:33 +08:00
parent 94fc1af6bd
commit 54385ed08b
6 changed files with 264 additions and 45 deletions

View File

@@ -82,7 +82,7 @@ TEST(PACKET, ETH_VLAN_VLAN_IP4_IP4_UDP)
const char *payload = packet_parse(&handler, (const char *)data1, sizeof(data1));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data1 == 70);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -321,7 +321,7 @@ TEST(PACKET, ETH_IP6_IP4_TCP_SSH)
const char *payload = packet_parse(&handler, (const char *)data2, sizeof(data2));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data2 == 94);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -540,7 +540,7 @@ TEST(PACKET, ETH_VLAN_IP6_IP4_GRE_PPP_IP4_UDP_DNS)
const char *payload = packet_parse(&handler, (const char *)data3, sizeof(data3));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data3 == 126);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -797,7 +797,7 @@ TEST(PACKET, ETH_IP4_IP6_TCP)
const char *payload = packet_parse(&handler, (const char *)data4, sizeof(data4));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data4 == 106);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -981,7 +981,7 @@ TEST(PACKET, ETH_IP6_IP6_UDP)
const char *payload = packet_parse(&handler, (const char *)data5, sizeof(data5));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data5 == 102);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -1166,7 +1166,7 @@ TEST(PACKET, ETH_MPLS_IP4_TCP)
const char *payload = packet_parse(&handler, (const char *)data6, sizeof(data6));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data6 == 70);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -1368,7 +1368,7 @@ TEST(PACKET, ETH_MPLS_MPLS_IP4_TCP)
const char *payload = packet_parse(&handler, (const char *)data7, sizeof(data7));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data7 == 66);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -1583,7 +1583,7 @@ TEST(PACKET, ETH_VLAN_PPPOE_IP4_TCP)
const char *payload = packet_parse(&handler, (const char *)data8, sizeof(data8));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data8 == 78);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -1863,7 +1863,7 @@ TEST(PACKET, ETH_IP6_UDP_GTP_IP6_TCP_TLS)
const char *payload = packet_parse(&handler, (const char *)data9, sizeof(data9));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data9 == 130);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -2149,7 +2149,7 @@ TEST(PACKET, ETH_IP6_UDP_GTP_IP4_TCP_TLS)
const char *payload = packet_parse(&handler, (const char *)data10, sizeof(data10));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data10 == 122);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -2383,7 +2383,7 @@ TEST(PACKET, ETH_IP4_UDP_VXLAN_ETH_IP4_UDP_DNS)
const char *payload = packet_parse(&handler, (const char *)data11, sizeof(data11));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data11 == 92);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -2575,7 +2575,7 @@ TEST(PACKET, ETH_MPLS_MPLS_PWETHCW_ETH_ARP)
const char *payload = packet_parse(&handler, (const char *)data12, sizeof(data12));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data12 == 40);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -2727,7 +2727,7 @@ TEST(PACKET, ETH_IP4_ICMP)
const char *payload = packet_parse(&handler, (const char *)data13, sizeof(data13));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data13 == 14 + 20 + 8);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -2859,7 +2859,7 @@ TEST(PACKET, ETH_IP6_ICMP6)
const char *payload = packet_parse(&handler, (const char *)data14, sizeof(data14));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data14 == 14 + 40 + 8);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -3050,7 +3050,7 @@ TEST(PACKET, ETH_IP4_UDP_L2TPV2_PPP_IP4_UDP)
const char *payload = packet_parse(&handler, (const char *)data15, sizeof(data15));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data15 == 14 + 20 + 8 + 8 + 4 + 20 + 8);
packet_print(&handler);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
@@ -3159,6 +3159,174 @@ TEST(PACKET, ETH_IP4_UDP_L2TPV2_PPP_IP4_UDP)
}
#endif
/******************************************************************************
* [Protocols in frame: eth:ethertype:ip:tcp]
******************************************************************************
*
* Frame 1: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
* Ethernet II, Src: 52:54:00:94:27:9b (52:54:00:94:27:9b), Dst: 52:54:00:19:8f:63 (52:54:00:19:8f:63)
* Destination: 52:54:00:19:8f:63 (52:54:00:19:8f:63)
* Source: 52:54:00:94:27:9b (52:54:00:94:27:9b)
* Type: IPv4 (0x0800)
* Padding: 000000000000
* Internet Protocol Version 4, Src: 192.168.122.202, Dst: 192.168.122.100
* 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: 40
* Identification: 0x0c5e (3166)
* 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: 64
* Protocol: TCP (6)
* Header Checksum: 0xb7f2 [correct]
* [Header checksum status: Good]
* [Calculated Checksum: 0xb7f2]
* Source Address: 192.168.122.202
* Destination Address: 192.168.122.100
* Transmission Control Protocol, Src Port: 1080, Dst Port: 62395, Seq: 1457975085, Ack: 1047768425, Len: 0
* Source Port: 1080
* Destination Port: 62395
* [Stream index: 0]
* [Conversation completeness: Incomplete (4)]
* ..0. .... = RST: Absent
* ...0 .... = FIN: Absent
* .... 0... = Data: Absent
* .... .1.. = ACK: Present
* .... ..0. = SYN-ACK: Absent
* .... ...0 = SYN: Absent
* [Completeness Flags: ···A··]
* [TCP Segment Len: 0]
* Sequence Number: 1457975085
* [Next Sequence Number: 1457975085]
* Acknowledgment Number: 1047768425
* 0101 .... = Header Length: 20 bytes (5)
* Flags: 0x010 (ACK)
* 000. .... .... = Reserved: Not set
* ...0 .... .... = Accurate ECN: Not set
* .... 0... .... = Congestion Window Reduced: Not set
* .... .0.. .... = ECN-Echo: Not set
* .... ..0. .... = Urgent: Not set
* .... ...1 .... = Acknowledgment: Set
* .... .... 0... = Push: Not set
* .... .... .0.. = Reset: Not set
* .... .... ..0. = Syn: Not set
* .... .... ...0 = Fin: Not set
* [TCP Flags: ·······A····]
* Window: 457
* [Calculated window size: 457]
* [Window size scaling factor: -1 (unknown)]
* Checksum: 0x0da7 [correct]
* [Calculated Checksum: 0x0da7]
* [Checksum Status: Good]
* Urgent Pointer: 0
* [Timestamps]
* [Time since first frame in this TCP stream: 0.000000000 seconds]
* [Time since previous frame in this TCP stream: 0.000000000 seconds]
*/
unsigned char data16[] = {
0x52, 0x54, 0x00, 0x19, 0x8f, 0x63, 0x52, 0x54, 0x00, 0x94, 0x27, 0x9b, 0x08, 0x00, 0x45, 0x00, 0x00, 0x28, 0x0c, 0x5e, 0x40, 0x00, 0x40, 0x06, 0xb7, 0xf2,
0xc0, 0xa8, 0x7a, 0xca, 0xc0, 0xa8, 0x7a, 0x64, 0x04, 0x38, 0xf3, 0xbb, 0x56, 0xe6, 0xef, 0x2d, 0x3e, 0x73, 0xad, 0x69, 0x50, 0x10, 0x01, 0xc9, 0x0d, 0xa7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
#if 1
TEST(PACKET, ETH_IP4_TCP_PADDING)
{
char buffer[256];
struct packet handler;
const char *payload = packet_parse(&handler, (const char *)data16, sizeof(data16));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data16 == 14 + 20 + 20);
packet_print_str(&handler);
/******************************************************
* packet_get_outermost/innermost_layer
******************************************************/
// LAYER_TYPE_ETHER
const struct packet_layer *outer_eth_record = packet_get_outermost_layer(&handler, LAYER_TYPE_ETHER);
const struct packet_layer *inner_eth_record = packet_get_innermost_layer(&handler, LAYER_TYPE_ETHER);
EXPECT_TRUE(outer_eth_record != nullptr);
EXPECT_TRUE(inner_eth_record != nullptr);
EXPECT_TRUE(outer_eth_record == inner_eth_record);
EXPECT_TRUE(outer_eth_record->hdr_offset == 0);
EXPECT_TRUE(outer_eth_record->hdr_len == 14);
EXPECT_TRUE(outer_eth_record->pld_len == 46);
// LAYER_TYPE_L2
const struct packet_layer *outer_l2_record = packet_get_outermost_layer(&handler, LAYER_TYPE_L2);
const struct packet_layer *inner_l2_record = packet_get_innermost_layer(&handler, LAYER_TYPE_L2);
EXPECT_TRUE(outer_l2_record != nullptr);
EXPECT_TRUE(inner_l2_record != nullptr);
EXPECT_TRUE(outer_l2_record == inner_l2_record);
EXPECT_TRUE(outer_l2_record == outer_eth_record);
// LAYER_TYPE_IPV4
const struct packet_layer *outer_ipv4_record = packet_get_outermost_layer(&handler, LAYER_TYPE_IPV4);
const struct packet_layer *inner_ipv4_record = packet_get_innermost_layer(&handler, LAYER_TYPE_IPV4);
EXPECT_TRUE(outer_ipv4_record != nullptr);
EXPECT_TRUE(inner_ipv4_record != nullptr);
EXPECT_TRUE(outer_ipv4_record == inner_ipv4_record);
EXPECT_TRUE(outer_ipv4_record->hdr_offset == 14);
EXPECT_TRUE(outer_ipv4_record->hdr_len == 20);
EXPECT_TRUE(outer_ipv4_record->pld_len == 20);
// LAYER_TYPE_L3
const struct packet_layer *outer_l3_record = packet_get_outermost_layer(&handler, LAYER_TYPE_L3);
const struct packet_layer *inner_l3_record = packet_get_innermost_layer(&handler, LAYER_TYPE_L3);
EXPECT_TRUE(outer_l3_record != nullptr);
EXPECT_TRUE(inner_l3_record != nullptr);
EXPECT_TRUE(outer_l3_record == inner_l3_record);
EXPECT_TRUE(outer_l3_record == outer_ipv4_record);
// LAYER_TYPE_TCP
const struct packet_layer *outer_tcp_record = packet_get_outermost_layer(&handler, LAYER_TYPE_TCP);
const struct packet_layer *inner_tcp_record = packet_get_innermost_layer(&handler, LAYER_TYPE_TCP);
EXPECT_TRUE(outer_tcp_record != nullptr);
EXPECT_TRUE(inner_tcp_record != nullptr);
EXPECT_TRUE(outer_tcp_record == inner_tcp_record);
EXPECT_TRUE(outer_tcp_record->hdr_offset == 34);
EXPECT_TRUE(outer_tcp_record->hdr_len == 20);
EXPECT_TRUE(outer_tcp_record->pld_len == 0);
// LAYER_TYPE_L4
const struct packet_layer *outer_l4_record = packet_get_outermost_layer(&handler, LAYER_TYPE_L4);
const struct packet_layer *inner_l4_record = packet_get_innermost_layer(&handler, LAYER_TYPE_L4);
EXPECT_TRUE(outer_l4_record != nullptr);
EXPECT_TRUE(inner_l4_record != nullptr);
EXPECT_TRUE(outer_l4_record == inner_l4_record);
EXPECT_TRUE(outer_l4_record == outer_tcp_record);
/******************************************************
* packet_get_outermost/innermost_tuple4
******************************************************/
struct tuple4 outer_tuple4;
struct tuple4 inner_tuple4;
EXPECT_TRUE(packet_get_outermost_tuple4(&handler, &outer_tuple4) == 0);
EXPECT_TRUE(packet_get_innermost_tuple4(&handler, &inner_tuple4) == 0);
memset(buffer, 0, sizeof(buffer));
tuple4_to_str(&outer_tuple4, buffer, sizeof(buffer));
EXPECT_STREQ(buffer, "192.168.122.202:1080-192.168.122.100:62395");
memset(buffer, 0, sizeof(buffer));
tuple4_to_str(&inner_tuple4, buffer, sizeof(buffer));
EXPECT_STREQ(buffer, "192.168.122.202:1080-192.168.122.100:62395");
}
#endif
#if 1
TEST(PACKET, HASH_VALUE)
{
@@ -3167,7 +3335,7 @@ TEST(PACKET, HASH_VALUE)
const char *payload = packet_parse(&handler, (const char *)data4, sizeof(data4));
EXPECT_TRUE(payload != nullptr);
EXPECT_TRUE((char *)payload - (char *)&data4 == 106);
packet_print(&handler);
packet_print_str(&handler);
// buffer: "2001:da8:200:900e:200:5efe:d24d:58a3 0 2600:140e:6::1702:1058 0"
// buffer: "210.77.88.163 0 59.66.4.50 0"