0

我无法通过 to 写入 1514 字节(包括 L2 信息write/dev/bpf。我可以编写较小的数据包(这意味着我认为基本设置是正确的),但我看到全长数据包的“消息太长”。这是在 Solaris 11.2 上。

就好像写入将其视为 IP 数据包的写入。

根据规范,IP 部分有 1500 个字节,L2 标头有 14 个字节(如果标记为 18 个),校验和有 4 个字节。

我已经设置了我认为会阻止操作系统添加自己的第 2 层信息的功能(是的,我也觉得奇怪的是1 禁用它;下面的伪代码):

int hdr_complete = 1;
ioctl(bpf, BIOCSHDRCMPLT, &hdr_complete);

数据包永远不会超过 1514 字节(它们是通过端口跨度捕获的,并以源和目标 MAC 地址开始;我正在有效地重放它们)。

我确定我在这里遗漏了一些基本的东西,但我遇到了死胡同。任何指针将不胜感激!

部分答案此链接非常有帮助。

2017 年 3 月 20 日更新 代码适用于 Mac OS X,但在 Solaris 上会导致重复的“系统调用中断”(EINTR)。我开始阅读关于必须实现信号处理的可怕事情,我宁愿不这样做......

GitHub 上的示例代码基于我通过 Google 找到的各种代码。在大多数系统上,您必须以 root 权限运行它,除非您已将“net_rawaccess”授予用户。

仍在尝试找出 EINTR 问题。输出truss

27158/1:         0.0122  0.0000 write(3, 0x08081DD0, 1514)                      Err#4 EINTR
27158/1:          \0 >E1C09B92 4159E01C694\b\0 E\005DC82E1 @\0 @06F8 xC0A81C\fC0A8
27158/1:          1C eC8EF14 Q nB0BC 4 V @FBDE8010FFFF8313\0\00101\b\n ^F3 W @ C E
27158/1:           d SDD G14EDEB ~ t sCFADC6 qE3C3B7 ,D9D51D VB0DFB0\b96C4B8EC1C90
27158/1:          12F9D7 &E6C2A4 Z 6 t\bFCE5EBBF9C1798 r 4EF "139F +A9 cE3957F tA7
27158/1:           x KCD _0E qB9 DE5C1 @CAACFF gC398D9F787FB\n & &B389\n H\t ~EF81
27158/1:          C9BCE0D7 .9A1B13 [ [DE\b [ ECBF31EC3 z19CDA0 @81 ) JC9 2C8B9B491
27158/1:           u94 iA3 .84B78AE09592 ;DA ] .F8  A811EE H Q o q9B 8A4 cF1 XF5 g
27158/1:          EC ^\n1BE2C1A5C2 V 7FD 094 + (B5D3 :A31B8B128D ' J 18A <897FA3 u

编辑 2017 年 4 月 7 日 EINTR 问题是我放在 GitHub 上的示例代码中的错误的结果。代码没有将 bpf 设备与实际接口相关联,因此 Solaris 抛出了 EINTR。

现在我回到我还没有解决的“消息太长”问题。

4

0 回答 0