我如何接收错误的以太网帧并禁用CRC / FCS计算?

我在运行Linux的两台PC之间生成一个stream量(通过发送以太网帧),目标是捕获一些错误帧。 问题是什么时候Phy层检测到一个帧的错误(如果CRC或FCS无效)帧被丢弃,我不能在我的程序接收它。

是否有任何方法来接收错误的框架(禁用在物理层的下降,并收到一个指示,表明这个帧是错误的,例如),我怎么可以咨询统计的NIC卡(滴数…等)。

Solutions Collecting From Web of "我如何接收错误的以太网帧并禁用CRC / FCS计算?"

你没有指定哪个操作系统,但我至少可以为Linux发言:

它可能在你的内核,网卡和驱动程序以及ethtool版本。

我们需要告诉驱动程序/硬件做两件事情,通常不这样做:1)将FCS字段传递给网络堆栈。 (通常在传递之前被截断)2)不丢弃具有不良FCS字段的分组,而是按原样传递它们

有两个ethtool选项来实现每个这些:

ethtool -K eth0 rx-fcs on #1 above: give us the FCS field ethtool -K eth0 rx-all on #2 above: even receive bad packets 

有了这些,我可以使用wireshark或tcpdump来查看FCS字段,即使它们不正确。 (在我的情况下,我有一些网络设备,用一个准确的时间戳即时替换校验和 – 这会导致数据包出现“坏”,我使用上述恢复)

不是所有的卡都能实现这个! 他们可能有上述ethtool选项“固定”或不响应。

在1G速度下,我看到e1000卡运行良好。 在10G的时候,我还没有找到一个可以做到这一点的网卡,而且必须依靠更复杂的数据采集卡。

再次,我不知道最低内核/ ethtool版本的要求是什么,但我记得要升级一个CentOS服务器,以使其工作。

我也知道,r8169和e1000驱动程序/卡可以做到这一点,但不能说任何其他组合。

另外请注意,您将无法在发送它们的计算机上捕获传出的FCS值,因为它们在进程中添加得相当晚(可能已卸载到卡本身),因此pcap无法看到。

在Linux 3.10.11内核上,使用ethtool 3.10:

 $ ethtool -k eth0 Features for eth0: rx-checksumming: on tx-checksumming: on tx-checksum-ipv4: off [fixed] tx-checksum-ip-generic: on tx-checksum-ipv6: off [fixed] tx-checksum-fcoe-crc: off [fixed] tx-checksum-sctp: off [fixed] scatter-gather: on tx-scatter-gather: on tx-scatter-gather-fraglist: off [fixed] tcp-segmentation-offload: on tx-tcp-segmentation: on tx-tcp-ecn-segmentation: off [fixed] tx-tcp6-segmentation: on udp-fragmentation-offload: off [fixed] generic-segmentation-offload: on generic-receive-offload: on large-receive-offload: off [fixed] rx-vlan-offload: on tx-vlan-offload: on ntuple-filters: off [fixed] receive-hashing: on highdma: on [fixed] rx-vlan-filter: on [fixed] vlan-challenged: off [fixed] tx-lockless: off [fixed] netns-local: off [fixed] tx-gso-robust: off [fixed] tx-fcoe-segmentation: off [fixed] tx-gre-segmentation: off [fixed] tx-udp_tnl-segmentation: off [fixed] fcoe-mtu: off [fixed] tx-nocache-copy: on loopback: off [fixed] rx-fcs: off rx-all: off tx-vlan-stag-hw-insert: off [fixed] rx-vlan-stag-hw-parse: off [fixed] rx-vlan-stag-filter: off [fixed] 

接着:

 $ sudo ethtool -K eth0 rx-fcs on rx-all on 

给我:

 $ ethtool -k eth0 Features for eth0: rx-checksumming: on tx-checksumming: on tx-checksum-ipv4: off [fixed] tx-checksum-ip-generic: on tx-checksum-ipv6: off [fixed] tx-checksum-fcoe-crc: off [fixed] tx-checksum-sctp: off [fixed] scatter-gather: on tx-scatter-gather: on tx-scatter-gather-fraglist: off [fixed] tcp-segmentation-offload: on tx-tcp-segmentation: on tx-tcp-ecn-segmentation: off [fixed] tx-tcp6-segmentation: on udp-fragmentation-offload: off [fixed] generic-segmentation-offload: on generic-receive-offload: on large-receive-offload: off [fixed] rx-vlan-offload: on tx-vlan-offload: on ntuple-filters: off [fixed] receive-hashing: on highdma: on [fixed] rx-vlan-filter: on [fixed] vlan-challenged: off [fixed] tx-lockless: off [fixed] netns-local: off [fixed] tx-gso-robust: off [fixed] tx-fcoe-segmentation: off [fixed] tx-gre-segmentation: off [fixed] tx-udp_tnl-segmentation: off [fixed] fcoe-mtu: off [fixed] tx-nocache-copy: on loopback: off [fixed] rx-fcs: on rx-all: on tx-vlan-stag-hw-insert: off [fixed] rx-vlan-stag-hw-parse: off [fixed] rx-vlan-stag-filter: off [fixed] 

你可以使用socket()调用来打开一个raw socket 。 例如下面的调用打开一个raw TCP socket

 int fd = socket (PF_INET, SOCK_RAW, IPPROTO_TCP); 

您可以将协议更改为任何您想要的,并且您可以确定您收到每个数据包。

上面的代码只会让你捕获好的数据包,因为损坏的数据包甚至不会到达操作系统,并且首先在交换机上或者在连接到PC的线路卡驱动器上丢弃。 在Wireshark wiki页面上可以找到关于同一主题的更多讨论