Native xdp hook 点
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 点相关推荐
- Generic XDP Hook
上一篇文章讲过bpf_prog_run_xdp是XDP 程序的最终调用函数,想要跟踪Generic XDP的代码可以从该函数入手.很显然你不应该从driver/,而是已改在net/目录下检索. jen ...
- Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解
一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...
- 万字长文|深入理解XDP全景指南
译者序 本文翻译自 2018 年 ACM CoNEXT 大会上的一篇文章: The eXpress Data Path: Fast Programmable Packet Processing in ...
- [译] Cilium:BPF 和 XDP 参考指南(2021)
Cilium:BPF和XDP参考指南_RToax-CSDN博客Table of ContentsBPF体系结构指令系统辅助功能地图对象固定尾叫BPF到BPF呼叫准时制硬化减负工具链开发环境虚拟机本文档 ...
- 同主机容器基于XDP的连通性实验
XDP原理介绍 受到Bastion论文的启发,我们尝试基于XDP来实现同主机上两个容器之间的端到端转发.XDP全称为eXpress Data Path, 是一种内核网卡上的Rx-hook,支持在网卡驱 ...
- c语言延时函数_介召几个frida在安卓逆向中使用的脚本以及延时Hook手法
0x00 frida简介 frida是近几年才推出的一款全平台的逆向神器.功能上主要采用动态hook的方式,加入log,修改逻辑等.可以对java,native等hook. 具体使用情况,谁用谁知道. ...
- XDP/eBPF — Overview
目录 文章目录 目录 XDP XDP 设计原则 XDP技术优势 XDP 的工作模式 XDP 的适用场景 XDP v.s. DPDK XDP XDP(eXpress Data Path,快速数据面)是 ...
- Android Hook (2) Java2java
原文地址:http://www.zhaoxiaodan.com/android/Android-Hook(2)-java2java.html 之前学习了如何做一个简单android的函数勾子, 而这个 ...
- Android Hook (1) Dexposed原理
原文地址:http://www.zhaoxiaodan.com/android/Android-Hook(1)-dexposed%E5%8E%9F%E7%90%86.html dexposed 这个项 ...
最新文章
- 《Docker——容器与容器云》:第五章 构建自己的容器云
- 全国独家首测 腾讯QQ 2011 Beta1体验
- winform自动更新之AutoUpdater.NET
- .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析
- 微软Project Springfield团队的F#使用心得
- 电脑有网络计算机共享怎么用,2台电脑怎么共享文件?没有网络也能共享【详解】...
- SharePoint 2013 入门教程--系列文章
- [查找问题] 例5.1 找x
- ​每一页都是知识点,这本Flutter企业级实践指南太绝了
- [转]什么是lib文件,lib和dll的关系如何
- android手机双卡的电话录音,苹果与android手机电话通话录音
- 靶机渗透练习81-Momentum:2
- RocketMQ独孤九剑-总纲
- 又一个IGame的bug
- 益阳城市学院计算机2008毕业学生蒋旭,毕业生档案交寄单.doc
- vue3 script setup写法
- Zzzzzz 每天来点负能量---看着就会心地笑了
- 第一节 、MPC5744P之系统集成单元总结 SIUL2(System Integration Unit Lite2 )介绍
- css(显示与隐藏、溢出)
- html阅读模式怎么进入word模式,Word视图阅读模式 带您体验Word2013进入阅读模式、视图设置功能...