我是 ebpf 和 xdp 主题的新手,想学习它。我的问题是如何使用 ebpf 过滤器过滤特定有效负载匹配的数据包?例如,如果数据包的数据(有效负载)为 1234,则将其传递给网络堆栈,否则将阻止该数据包。我达到了有效载荷长度。例如,如果我想匹配消息有效负载长度,它可以正常工作,但是当我开始匹配有效负载字符时出现错误。这是我的代码:
int ret_val;
unsigned long payload_offset;
unsigned long payload_size;
const char *payload = "test";
struct ethhdr *eth = data;
if ((void*)eth + sizeof(*eth) <= data_end) {
struct iphdr *ip = data + sizeof(*eth);
if ((void*)ip + sizeof(*ip) <= data_end) {
if (ip->protocol == IPPROTO_UDP ) {
struct udphdr *udp = (void*)ip + sizeof(*ip);
if ((void*)udp + sizeof(*udp) <= data_end) {
if (udp->dest == ntohs(5005)) {
payload_offset = sizeof(struct udphdr);
payload_size = ntohs(udp->len) - sizeof(struct udphdr);
unsigned char *s = (unsigned char *)&payload_size;
if (ret_val == __builtin_memcmp(s,payload,4) == 0) {
return XDP_DROP;
}
}
}
}
}
}
错误已删除,但无法比较有效负载...我正在从 python 套接字代码发送 UDP 消息。如果我比较有效载荷长度,它工作正常。