这篇文章主要解析常用的BPF命令
参考文章:https://www.freebsd.org/cgi/man.cgi?query=bpf&sektion=4&manpath=FreeBSD | 4.7-RELEASE
上篇文章 BPF初探 - Android中BPF运用实例解析 介绍了Android源码中对BPF的运用,其中配置的BPF过滤规则看起来很简洁,但类似汇编代码的规则配置让初学者看起来非常难受,下面就对常用的指令进行解释。
基础知识
在指令解析之前,为了能够更好的理解,我们需要先贯彻以下几点知识:
1. 以太头长度定长,一共14个字节
/** if_ether.h*/
#define ETH_ALEN 6
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; // 6字节dest mac
unsigned char h_source[ETH_ALEN]; // 6字节src mac
__be16 h_proto; // 2字节protocol
}
2. ip头不定长,需要根据ip头中第一个字节后4位(BIG_ENDIAN)来确定
/** ip.h*/
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4, // IPv4|IPv6
ihl:4; // ip头长度
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos; // 服务类型,代表包的优先级
__be16 tot_len; // 整个包分节长度
__be16 id; // 标识
__be16 frag_off;