1

FreeBSD 内核中 bpf_filter() 的可能返回码是什么?

每个返回码是什么意思?

手册页(链接)在这个问题上不清楚。

bpf_filter()函数在包 pkt 上从 pc 开始执行过滤程序。wirelen 参数是原始数据包的长度,buflen 是存在的数据量。buflen 的值0 比较特殊;它表明 pkt 实际上是一个指向 mbuf 链 ( struct mbuf *) 的指针。

返回值

如果没有过滤器,该bpf_filter()函数将返回(转换为无符号整数)。-1否则,它返回过滤程序的结果。

65535当有比赛和0没有比赛时,我会得到。不确定返回值是什么意思65535

有人可以bpf_filter()详细解释一下返回码吗?

4

2 回答 2

1

bpf_filter() 的返回值是过滤程序的结果。结果是将被过滤的数据包的字节数复制到任务的缓冲区(过滤器返回指令值)。

如果数据包与过滤器不匹配,则该值将为 0。如果数据包与过滤器匹配,它将是 pcap_open_ 调用中定义的快照长度 (snaplen)。

默认值为 65535 字节,因为 TCP 数据包的最大大小为 64K(65535 字节)。

于 2017-08-31T11:56:22.863 回答
0

该函数bpf_filter()将一个指向包含 BPF 指令的结构的指针作为参数(pc在手册页上)并在数据包上运行这些指令以过滤它们。

如果没有过滤器,则 bpf_filter() 函数返回 -1(转换为无符号整数)。

我们可以在源代码中检查,当pc应该包含 BPF 指令的结构为 null 时,bpf_filter()立即返回-1,强制转换为 a u_int

if (pc == 0)
    /*
     * No filter means accept all.
     */
    return (u_int)-1;

[已编辑]在内部,对于有符号整数,-1将存储为“整数的最大值,减一”。对于 32 位,由于这里的返回值被强制转换为无符号整数,因此2^32 - 1.
由于此处的返回值被转换为无符号整数,因此这是您获得的值:65535等于2**16 - 1,因此-1转换为无符号 16 位长整数 (a u_int)。所以我倾向于相信,当你看到这个65535值时,你实际上并没有为函数提供任何 BPF 程序?这与你的观察一致吗?

现在有比赛时:

否则,它返回过滤程序的结果。

的结果值bpf_filter()是从 BPF 程序中检索到的结果。所以当你得到一个0返回值时,就意味着:

  • 您的 BPF 程序完成并返回0
  • 或者可能(即使手册页中似乎没有记录),在运行 BPF 程序时遇到了错误。这是一个示例,也来自源:

    case BPF_ALU|BPF_DIV|BPF_X:
        if (X == 0)
            return 0;
        A /= X;
        continue;
    

“在算术除法的情况下,如果分母X为空,则bpf_filter()返回0,否则A逐个寄存器除X并继续执行下一条指令”。

[编辑](见评论)正如你所发现的,这同样适用于65535值:它是你让你的 BPF 程序返回的值。

于 2016-08-27T17:30:08.283 回答