FPGA生成的IPv4/UDP数据包被PC丢弃的问题排查求助
各位前辈好,我最近在做FPGA生成IPv4/UDP数据包的项目,遇到了一个卡壳的问题,想请大家帮忙分析下。
目前遇到的现象
- 我生成的数据包,只有在执行
sudo ethtool -K enp2s0 rx-all on开启网卡全接收模式时,Wireshark才能抓到; - 关闭rx-all(也就是网卡正常工作模式)时,这些数据包会被PC在Wireshark之前就丢弃,并且被标记为帧错误;
- 但如果我去掉IPv4头,只发原始以太网帧的话,即使rx-all关闭,PC也能正常接收,这说明MII接口和以太网帧的封装应该是没问题的。
已经排查过的内容
- Wireshark检查数据包无错误:UDP校验码设为0x0000(IPv4规范允许这么做),MAC/IP目标地址和我的PC完全匹配,FCS和IPv4校验码也都是正确的;
- 反复核对了目标MAC和IP地址,确认和PC的
enp2s0网卡信息一致; - 用
sudo ethtool -S enp2s0查看网卡统计信息,没找到能指向问题的错误提示; - 裸以太网帧能正常接收,排除了链路层的基础问题。
我的PC网卡配置
$ 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
Wireshark抓包详情(rx-all开启时抓到的数据包)
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.100User 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]
我已经把能想到的点都查了一遍,但还是找不到问题根源。我的最终目标是生成能在正常网络环境(比如经过交换机)中传输的UDP数据包,想请教大家:
- 有没有什么我遗漏的检查点?
- 是否需要先发送ARP数据包来完成地址解析?
- 是不是必须要启用UDP校验码,即使IPv4允许设为0?
备注:内容来源于stack exchange,提问作者stanri

