XDP 支持三种操作模式:

Native XDP(XDP_FLAGS_DRV_MODE)

默认的工作模式,Native工作在网卡驱动的RX队列上。

Offloaded XDP(XDP_FLAGS_HW_MODE)

offloaded 模式,XDP BPF程序直接工作在NIC中处理报文,一般是智能网卡的模式。

Generic XDP(XDP_FLAGS_SKB_MODE)

通用模式,当上述两种模式都不支持的时候,还可以使用通用模式。

这三种模式分别工作在不同的层次,Native XDP在网卡驱动中,Offloaded XDP 硬件中,Generic XDP网络协议中。性能有很大的差别。

今天我们重点看看Native XDP的hook点,所以Native XDP是我们今天的主角。

看到xdp功能的时候,你可能已经猜到了xdp一定有在内核中有hook,你也可能猜到了xdp的hook应该在网卡程序中,但是你可能不知道xdp hook 具体在网卡驱动的那个流程中,今天走读了一遍xdp的代码逻辑,简单记录内容如下。

bpf_prog_run_xdp

bpf_prog_run_xdp函数是xdp的框架函数,你注册的xdp程序将会在这个函数中被调用。

xdp的hook是在内核驱动中 ? 你可以过滤一下这个函数,大概应该和我的差不多:

xxx@xxx$ grep -rn "bpf_prog_run_xdp" .
./net/core/dev.c:4324:  act = bpf_prog_run_xdp(xdp_prog, xdp);
./drivers/net/tun.c:1634:       act = bpf_prog_run_xdp(xdp_prog, &xdp);
./drivers/net/ethernet/intel/i40e/i40e_txrx.c:2242: act = bpf_prog_run_xdp(xdp_prog, xdp);
./drivers/net/ethernet/intel/ixgbe/ixgbe_main.c:2214:   act = bpf_prog_run_xdp(xdp_prog, xdp);
./drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c:1067:   act = bpf_prog_run_xdp(xdp_prog, xdp);
./drivers/net/ethernet/qlogic/qede/qede_fp.c:1084:  act = bpf_prog_run_xdp(prog, &xdp);
./drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c:106:    act = bpf_prog_run_xdp(xdp_prog, &xdp);
./drivers/net/ethernet/mellanox/mlx4/en_rx.c:775:           act = bpf_prog_run_xdp(xdp_prog, &xdp);
./drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c:71:  act = bpf_prog_run_xdp(prog, &xdp);
./drivers/net/ethernet/netronome/nfp/nfp_net_common.c:1744:         act = bpf_prog_run_xdp(xdp_prog, &xdp);
./drivers/net/ethernet/cavium/thunder/nicvf_main.c:538: action = bpf_prog_run_xdp(prog, &xdp);
./drivers/net/veth.c:399:       act = bpf_prog_run_xdp(xdp_prog, &xdp);
./drivers/net/veth.c:525:   act = bpf_prog_run_xdp(xdp_prog, &xdp);
./drivers/net/virtio_net.c:668:     act = bpf_prog_run_xdp(xdp_prog, &xdp);
./drivers/net/virtio_net.c:823:     act = bpf_prog_run_xdp(xdp_prog, &xdp);
./include/linux/filter.h:619:static __always_inline u32 bpf_prog_run_xdp(const struct bpf_prog *prog,

当然,这不是关键,这只是印证了前面的第二个 猜测。

下面我们具体看看这个函数:

static __always_inline u32 bpf_prog_run_xdp(const struct bpf_prog *prog,struct xdp_buff *xdp)
{/* Caller needs to hold rcu_read_lock() (!), otherwise program* can be released while still running, or map elements could be* freed early while still having concurrent users. XDP fastpath* already takes rcu_read_lock() when fetching the program, so* it's not necessary here anymore.*/return BPF_PROG_RUN(prog, xdp);
}#define BPF_PROG_RUN(filter, ctx)  (*(filter)->bpf_func)(ctx, (filter)->insnsi)

BPF_PROG_RUN在执行你挂载的函数,看上去在xdp的框架函数中只能挂载有一个xdp程序?

当然你可能对怎么挂载感兴趣,下一篇再讲。

xdp的挂载点

顺着 bpf_prog_run_xdp  的线索,去查找它的调用关系,你很快就能找到xdp的真正挂载点。

bpf_prog_run_xdp

ixgbe_run_xdp

ixgbe_clean_rx_irq

ixgbe_poll

/*** ixgbe_poll - NAPI Rx polling callback* @napi: structure for representing this polling device* @budget: how many packets driver is allowed to clean** This function is used for legacy and MSI, NAPI mode**/
int ixgbe_poll(struct napi_struct *napi, int budget)

看到这差不多已经知道他的挂载点了吗 ?

另外,上面的调用关系只在rx方向有逻辑,tx是没有的。所以xdp支持在rx的报文处理,如果想要在tx方向处理,你只能转而研究tc epbf 了,tc比xdp强大的是rx tx都有hook点,但是论性能就比xdp差了,为啥差呢,已经很明显了吧。

Native xdp hook 点相关推荐

  1. Generic XDP Hook

    上一篇文章讲过bpf_prog_run_xdp是XDP 程序的最终调用函数,想要跟踪Generic XDP的代码可以从该函数入手.很显然你不应该从driver/,而是已改在net/目录下检索. jen ...

  2. Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解

    一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...

  3. 万字长文|深入理解XDP全景指南

    译者序 本文翻译自 2018 年 ACM CoNEXT 大会上的一篇文章: The eXpress Data Path: Fast Programmable Packet Processing in ...

  4. [译] Cilium:BPF 和 XDP 参考指南(2021)

    Cilium:BPF和XDP参考指南_RToax-CSDN博客Table of ContentsBPF体系结构指令系统辅助功能地图对象固定尾叫BPF到BPF呼叫准时制硬化减负工具链开发环境虚拟机本文档 ...

  5. 同主机容器基于XDP的连通性实验

    XDP原理介绍 受到Bastion论文的启发,我们尝试基于XDP来实现同主机上两个容器之间的端到端转发.XDP全称为eXpress Data Path, 是一种内核网卡上的Rx-hook,支持在网卡驱 ...

  6. c语言延时函数_介召几个frida在安卓逆向中使用的脚本以及延时Hook手法

    0x00 frida简介 frida是近几年才推出的一款全平台的逆向神器.功能上主要采用动态hook的方式,加入log,修改逻辑等.可以对java,native等hook. 具体使用情况,谁用谁知道. ...

  7. XDP/eBPF — Overview

    目录 文章目录 目录 XDP XDP 设计原则 XDP技术优势 XDP 的工作模式 XDP 的适用场景 XDP v.s. DPDK XDP XDP(eXpress Data Path,快速数据面)是 ...

  8. Android Hook (2) Java2java

    原文地址:http://www.zhaoxiaodan.com/android/Android-Hook(2)-java2java.html 之前学习了如何做一个简单android的函数勾子, 而这个 ...

  9. Android Hook (1) Dexposed原理

    原文地址:http://www.zhaoxiaodan.com/android/Android-Hook(1)-dexposed%E5%8E%9F%E7%90%86.html dexposed 这个项 ...

最新文章

  1. 《Docker——容器与容器云》:第五章 构建自己的容器云
  2. 全国独家首测 腾讯QQ 2011 Beta1体验
  3. winform自动更新之AutoUpdater.NET
  4. .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析
  5. 微软Project Springfield团队的F#使用心得
  6. 电脑有网络计算机共享怎么用,2台电脑怎么共享文件?没有网络也能共享【详解】...
  7. SharePoint 2013 入门教程--系列文章
  8. [查找问题] 例5.1 找x
  9. ​每一页都是知识点,这本Flutter企业级实践指南太绝了
  10. [转]什么是lib文件,lib和dll的关系如何
  11. android手机双卡的电话录音,苹果与android手机电话通话录音
  12. 靶机渗透练习81-Momentum:2
  13. RocketMQ独孤九剑-总纲
  14. 又一个IGame的bug
  15. 益阳城市学院计算机2008毕业学生蒋旭,毕业生档案交寄单.doc
  16. vue3 script setup写法
  17. Zzzzzz 每天来点负能量---看着就会心地笑了
  18. 第一节 、MPC5744P之系统集成单元总结 SIUL2(System Integration Unit Lite2 )介绍
  19. css(显示与隐藏、溢出)
  20. html阅读模式怎么进入word模式,Word视图阅读模式 带您体验Word2013进入阅读模式、视图设置功能...

热门文章

  1. 微信windows版_微信悄悄更新,这个烦人的功能限制,终于被取消
  2. win python 判断 所有 子进程 结束_python 多进程如何终止或重启子进程?
  3. GPS定位系统及协议介绍
  4. Taobao平台API的应用场景和实例
  5. Linux防火墙入门:简介(转)
  6. word2019输入文字时很卡解决方法。
  7. 跳动的爱心代码--李峋爱心代码(完整源码)
  8. python -m pip install --upgrade pip更新pip报错终极解决方法
  9. 你知道管理工作中要远离三只猫吗?
  10. 企业内网怎么连接外网?