BPF进阶 - BPF常用命令

本文深入解析BPF(Berkeley Packet Filter)的常用命令,包括其8种指令类型,如复制到累加器、条件跳转等,并讲解了如何计算到ip、udp/tcp/icmp头的偏移。通过对基础知识的阐述,帮助读者更好地理解BPF过滤规则的配置和工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章主要解析常用的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;              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值