C 如何使用bpf返回数据包

C 如何使用bpf返回数据包,c,C,我想用bpf过滤数据包。我研究了bpf手册并编写了过滤器。这是我的筛选器的最后一行: BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 16), 我加载了ip数据包的长度。现在我想返回sizeof(struct ether\u header)加上长度abov 如何编写此筛选器 在这里,您将数据包中的一个单词加载到累加器中: BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 16), BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 14), 首先,您必

我想用bpf过滤数据包。我研究了bpf手册并编写了过滤器。这是我的筛选器的最后一行:

BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 16),
我加载了ip数据包的长度。现在我想返回
sizeof(struct ether\u header)
加上长度abov


如何编写此筛选器

在这里,您将数据包中的一个单词加载到累加器中:

BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 16),
BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 14),
首先,您必须向累加器添加以太网报头的大小(14字节):

BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 16),
BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 14),
然后,在累加器中返回此值以将数据获取到用户空间:

BPF_STMT(BPF_RET+BPF_A, 0)
注:


如果要提取IP总长度,则必须在第一条语句中加载半字(IP总长度仅为16位值,因此请使用BPF\u H而不是BPF\u W

谢谢。BPF_STMT有一个操作数部分。我应该设置什么呢?@F.M应该被忽略,你可以使用0我认为0意味着忽略packet@F.M如果返回0,则忽略该数据包。如果您使用
BPF_RET+BPF_K,0
,则会出现这种情况。但是
BPF_RET+BPF_A,0
不返回0,而是返回累加器的内容,累加器的内容应为非零。