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()
的返回码吗?
答案 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 code当pc
应该包含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()
返回值时,意味着:
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程序返回的值。