在FreeBSD内核中,bpf_filter()的可能返回码是什么?每个返回代码的含义是什么?

时间:2016-08-25 14:00:50

标签: freebsd tcpdump bpf

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

每个返回代码的含义是什么?

man page (link)在这个问题上并不清楚。

bpf_filter()函数执行从pc on开始的过滤程序      包pkt。 wirelen参数是原始的长度      packet和buflen是存在的数据量。 0的buflen值      很特别;它表明pkt实际上是指向mbuf的指针      chain(struct mbuf *)。

返回值

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

我在匹配时获得65535,而在没有匹配时获得0。不确定返回值65535的含义是什么。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

  

bpf_filter()函数返回-1(强制转换为无符号整数)if   没有过滤器。

我们可以检查in the source codepc应该包含BPF指令的结构为空时,bpf_filter()立即返回-1,转换为{{} 1}}:

u_int

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

现在有匹配时:

  

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

65535的结果值是从BPF程序中检索到的结果。因此,当您获得bpf_filter()返回值时,意味着:

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

    0

“在算术除法的情况下,如果分母case BPF_ALU|BPF_DIV|BPF_X: if (X == 0) return 0; A /= X; continue; 为空,则使X返回bpf_filter(),否则将寄存器0除以寄存器{{1}继续执行下一条指令“。

[已编辑] (请参阅评论)正如您所发现的那样,同样适用于A值:它是您使BPF程序返回的值。