这篇文章主要介绍如何使用BPF过滤固定特征报文
参考文章:https://www.freebsd.org/cgi/man.cgi?query=bpf&sektion=4&manpath=FreeBSD | 4.7-RELEASE
前两篇文章分别介绍了BPF在Android中的运用实例,以及BPF规则指令的解析,相信大家对BPF及其规则都有了大致的了解。现在我们来看看如何运用BPF来过滤固定特征的报文,从这个过程中加深对BPF规则的了解和运用。
IP过滤
/**
* 构建源ip和目标ip过滤的socket filter,并绑定在创建的socket上
* @param socket_fd 已创建的socket fd
* @param src_ip 需要过滤的源ip
* @param dest_ip 需要过滤的目标ip
*/
void attachSocketFilter(int socket_fd, uint32_t src_ip, uint32_t dest_ip) {
uint32_t ip_offset = sizeof(ether_header);
std::vector<sock_filter> filter_code;
// 源ip过滤
uint32_t saddr_offset = ip_offset + offsetof(iphdr, saddr);
filter_code.push_back(BPF_STMT(BPF_LD | BPF_W | BPF_ABS, saddr_offset));
filter_code.push_back(BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, src_ip, 3, 4));
// 目标ip过滤
uint32_t daddr_offset = ip_offset + offsetof(iphdr, daddr);
filter_code.push_back(BPF_STMT(BPF_LD | BPF_W | BPF_ABS, saddr_offset));
filter_code.push_back(BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, src_ip, 0, 1));
// Fail or Success
filter_code.push_back(BPF_STMT(BPF_RET | BPF_K, 0xffff));
filter_code.push_back(BPF_STMT(BPF_RET | BPF_K, 0));
stru