我正在使用 FPGA 创建 IPv4/UDP 数据包。
下面是数据包的样子。Wireshark 根本没有标记错误。我使用的 UDP 校验和为 0x0000(允许 IPv4),MAC/IP 目标匹配,并且 FCS 和 IPv4 校验和正确。
仅当我使用 EthTool 在 PC MAC 上启用 rx-all 时,我才能看到数据包。
sudo ethtool -K enp2s0 rx-all on
如果关闭此功能(通常的操作模式),这些数据包在到达 wireshark 之前会被 PC 丢弃,并被标记为帧错误。
sudo ethtool -S enp2s0
没有显示任何有用的信息。
我已经用我的电脑仔细检查了目标 MAC/IP。
如果我取出标头的 IPv4 部分(因此只是一个原始以太网数据包),即使有 ,数据包也会通过rx-all off
。(我也可以在下面包括它,但按原样包括已经很多了)。由于原始数据包有效,我相当确定我的 MII 接口和以太网帧是正确的。
我尝试了所有方法,但还是无法弄清楚为什么这些数据包仍然被丢弃。我的目标是创建可以通过普通网络(通过交换机等)传输的 UDP 数据包。
我还遗漏了什么吗?我是否也需要提供 ARP 数据包?我是否仍然需要 UDP 校验和?
$ sudo ifconfig enp2s0
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
ether 74:d4:35:aa:9d:1a txqueuelen 1000 (Ethernet)
RX packets 26372 bytes 13819100 (13.1 MiB)
RX errors 177 dropped 0 overruns 0 frame 177
TX packets 1613 bytes 137389 (134.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ sudo ethtool -S enp2s0
NIC statistics:
tx_packets: 1597
rx_packets: 26372
tx_errors: 0
rx_errors: 0
rx_missed: 0
align_errors: 0
tx_single_collisions: 0
tx_multi_collisions: 0
unicast: 26372
broadcast: 0
multicast: 0
tx_aborted: 0
tx_underrun: 0
Frame 1257: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface enp2s0, id 0
Section number: 1
Interface id: 0 (enp2s0)
Encapsulation type: Ethernet (1)
Arrival Time: Nov 24, 2023 15:24:18.467278031 SAST
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1700832258.467278031 seconds
[Time delta from previous captured frame: 0.127289169 seconds]
[Time delta from previous displayed frame: 0.127289169 seconds]
[Time since reference or first frame: 4627.139850121 seconds]
Frame Number: 1257
Frame Length: 54 bytes (432 bits)
Capture Length: 54 bytes (432 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: eth:ethertype:ip:udp:data]
[Coloring Rule Name: UDP]
[Coloring Rule String: udp]
Ethernet II, Src: PcsCompu_fb:dd:66 (08:00:27:fb:dd:66), Dst: Giga-Byt_aa:9d:1a (74:d4:35:aa:9d:1a)
Destination: Giga-Byt_aa:9d:1a (74:d4:35:aa:9d:1a)
Source: PcsCompu_fb:dd:66 (08:00:27:fb:dd:66)
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 192.168.1.101, Dst: 192.168.1.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: 0x0000 (0)
000. .... = Flags: 0x0
...0 0000 0000 0000 = Fragment Offset: 0
Time to Live: 64
Protocol: UDP (17)
Header Checksum: 0xf6ab [correct]
[Header checksum status: Good]
[Calculated Checksum: 0xf6ab]
Source Address: 192.168.1.101
Destination Address: 192.168.1.100
User Datagram Protocol, Src Port: 65535, Dst Port: 65535
Source Port: 65535
Destination Port: 65535
Length: 20
Checksum: 0x0000 [zero-value ignored]
[Checksum Status: Not present]
[Stream index: 43]
[Timestamps]
[Time since first frame: 43.780741653 seconds]
[Time since previous frame: 40.026103244 seconds]
UDP payload (12 bytes)
Data (12 bytes)
Data: 53574954434845533a2087e0
[Length: 12]
之前曾询问网络工程 StackExchange。
答案1
终于明白了!!
结果是数据包太短了。以太网数据包的最小长度为 64B,而这个数据包只有 54B。