Linux 上的以太网接口丢弃数据包

Linux 上的以太网接口丢弃数据包

我正在尝试使用 Linux 捕获一些以太网帧。其中一些数据包/帧无效且包含损坏的数据。

例如,以太网帧包含类型 0x0800,即 IPv4,但后续数据仅包含随机字节。此外,源和目标 MAC 是未知且不可预测的。

为了接收这些帧,我编写了一个 C 程序,最初使用原始套接字。这并没有像预期的那样工作,所以我改用 libpcap。

我以混杂模式打开以太网设备以接收所有帧并防止 MAC 端过滤。这很有效。我可以接收具有任何目标 MAC 地址的帧。

现在我们来谈谈大问题:

我发送一个以太网帧,其目标和源 MAC 为随机数。类型字段为 0x1234,数据只有几个字节,比如说 0xdeadbeef。这会被填充到最小有效载荷量。我的程序使用 libpcap 成功接收了此帧。

当我使用“已知”以太网类型字段值(例如 0x0800)发送相同帧时,该帧会被丢弃,并且我的程序无法接收它。

该软件运行在嵌入式平台上,即具有 STMMAC 以太网模块的 Altera Cyclone V SoC。在普通 PC/笔记本等上,该程序运行良好,甚至可以接收这些无效的 IPv4 帧。

为了找出数据包丢失的位置,我查看了相关/sy/class/net/eth0/statistics/rx_*文件。有些文件会统计接收到的数据包和字节数以及丢失的数据包数。这些统计数据在正常的以太网流量下工作正常。但是,如上所述发送无效帧不会导致统计数据发生任何变化。驱动程序甚至不会对“丢失的帧”计数器进行计数。我无法理解这一点,因为据我所知,只要硬件接收到数据包,网络接口的统计数据就会受到影响。网络堆栈的过滤和评估过程应该与此无关。我说得对吗?因此,在我看来,一些非常低级的驱动程序代码正在过滤这些数据包,甚至可能是硬件本身。

再说一遍:用另一端的普通电脑可以用我编写的程序接收数据包。

第二个问题与有效的 TCP 数据包有关:

虽然我使用的是为我提供原始流量的 libpcap,但接收到的 TCP 数据包被重新组合成巨大的数据包,这些数据包甚至比接收网络接口的 MTU 还要大。这些数据包也可以通过 PC 正常接收。

有人能帮助我吗?我需要使用 Altera SoC-FPGA 平台上的 Linux“原样”接收原始以太网流量。

相关内容