BPF进阶 - BPF常用命令

这篇文章主要解析常用的BPF命令 参考文章:https://www.freebsd.org/cgi/man.cgi?query=bpf&sektion=4&manpath=FreeBSD | 4.7-RELEASE上篇文章 BPF初探 - Android(DhcpClient)中BPF运用实例解析 介绍了Android源码中对BPF的运用,其中配置的BPF过滤规则...
摘要由CSDN通过智能技术生成

这篇文章主要解析常用的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;                            // 标识 
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值