DPDK 中 IPv4 数据包的大小错误

Wrong size of IPv4 packets in DPDK

我将这些数据包保存在 pcap 文件中(在 wireshark 中显示)

我正在使用 DPDK 解析这些数据包,但由于某些原因我无法使用 mbufs。要使用 struct ipv4_hdr and struct ether_hdr 解析它们,如下所示:

eth_hdr = (struct ether_hdr *) pckt;
ip_hdr = (struct ipv4_hdr *)((unsigned char *) pckt + sizeof(struct ether_hdr));

ipv4_hdr中的total_length是ipv4的大小header+数据的大小。 etherhet 的大小 header 应该是数据包的总长度,对吧?

size = rte_bswap16(ip_hdr->total_length) + sizeof(struct ether_hdr);

这 6 个数据包输出:

54, 54, 54, 54, 54, 54

第一个、第三个和第五个数据包是正确的,但其他数据包比应有的少了 6 个字节。

我在问数据包中的这 6 个字节是什么以及如何使用 ipv4 和以太网找出正确的大小 headers:

54, 60, 54, 60, 54, 60

在 wireshark 中,所有这些数据包都有 total_length 40 个字节,sizeof(ether_hdr) 是 14 个字节 -> 它应该是 54 个。

我猜根本原因是最小以太网帧长度。如Wikipedia says,最小帧长为64字节。

在每个以太网帧的末尾,我们添加了帧校验序列(FCS,4 个八位字节),因此以太网 header 和有效负载最少需要 60 个八位字节。

现在回答您的问题:

I am asking what these 6 bytes in packets

这些是使以太网帧(带有 FCS)至少为 64 个八位字节的零填充。

对于传出数据包,还没有填充,稍后将由driver或NIC本身添加。所以 Wireshark 显示未填充的帧,即 40 字节的 IP + 14 字节的以太网 header(没有 FCS)使 54 字节。

对于传入的数据包,发送方已经添加了填充。所以 Wireshark 显示带有填充的帧,即 64 个八位字节 - 4 个八位字节 FCS = 60 个八位字节。

how to find out the correct sizes using ipv4 and ether headers

你的方法完全正确。帧末尾的那些零只是填充,应该被忽略。如果我们真的需要一个正确的长度,我们应该考虑如上所述的最小帧长度。