我正在使用以下python代码将原始以太网帧发送到回送接口(Linux ubuntu 4.15.0-34-generic):
from scapy.all import *
pkt = Ether(dst="aa:aa:aa:aa:aa:aa", src="00:ff:00:ff:00:ff", type=0x6666) / ("A"*50)
sendp(pkt, iface="lo")
(我们使用自定义的以太网类型0x6666,但是使用以太网II帧格式指定的数据包长度(50)具有相同的结果)
我希望在接收器(或Wireshark)中看到一个长度为14 + 50 = 64字节的数据包。相反,我看到的是14 + 50 + 14 = 78字节的数据包。添加的14个字节的内容似乎是随机的(或者可能是来自未清零的重用缓冲区的数据)。
作为示例,以下Wireshark输出来自上面代码的两次连续调用:
0000 aa aa aa aa aa aa 00 ff 00 ff 00 ff 66 66 41 41 ............ffAA
0010 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0020 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0030 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0040 00 00 00 00 00 00 10 00 00 00 00 00 00 00 ..............
0000 aa aa aa aa aa aa 00 ff 00 ff 00 ff 66 66 41 41 ............ffAA
0010 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0020 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0030 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0040 22 20 68 6f 73 74 6e 61 6d 65 3d 3f 20 61 " hostname=? a
我很好奇为什么要添加14个字节(由于数据包比以太网数据包所需的64个字节长,所以这不是填充问题)吗?以及在这个示例中如何摆脱14个额外的字节?
答案 0 :(得分:1)
波纹管对内核的承诺是导致原始发布者提到的回归的原因。
描述:数据包:在packet_snd中,开始在链路层分配处写入
GIT SHA:c6026847a0a1198e4d0b200da6666cb1056b12fe
https://lore.kernel.org/patchwork/patch/899678/
有两种解决方案。
1)降级到4.15.0-32-generic或更早版本
2)下载当前内核的源代码并删除该补丁并进行编译。
3)将其报告给lkml,等待他们修复。
上面的补丁提到它也适用于RAW数据包,但是在附加更多字节以查看是否需要附加任何字节之前不检查大小。最小总数据包大小应为64个字节。
显示上述补丁不再存在于当前内核和kernel.org中,这现在是一个Ubuntu问题。
EDIT2:git树中的ubuntu 4.15.0-36.39不再具有33中显示的补丁。因此ubuntu应该在某个时候解决此问题。
答案 1 :(得分:0)
我还看到了这个4.15.0-33泛型,它是最早出现的地方。
4.15.0-32-generic没有问题,也没有具体说明, 以太网驱动程序,因为我也尝试过使用USB以太网来确保。