ebpf教程(4.1):XDP程序的加载

文章目录

    • 前言
    • 环境准备
    • 加载XDP程序
      • 源码
      • 构建过程
      • 运行

前言

前置阅读要求:

  • ebpf教程(3):使用cmake构建ebpf项目-CSDN博客
  • [译] [论文] XDP (eXpress Data Path):在操作系统内核中实现快速、可编程包处理(ACM,2018)
  • xdp-tools/lib/libxdp/README.org at master · xdp-project/xdp-tools

在阅读完上面的文档后,我们大概知道XDP(eXpress Data Path)允许在数据包进入内核协议栈之前进行处理,这减少了不必要的开销。由于处理发生在内核的早期阶段,XDP 能够显著提高网络处理性能,特别是对于高流量的场景。

本文是XDP的hello world – 加载XDP程序。


环境准备

# 安装依赖
apt install libxdp-dev xdp-tools# 当前的libxdp版本
pkg-config --modversion libxdp
1.4.2# 当前的内核版本(ubuntu24的内核)
uname -r
6.8.0-31-generic

我当前的网络拓扑如下图所示。当然本文的示例对网络拓扑没有要求,把程序加载到网卡上即可。

在这里插入图片描述


加载XDP程序


源码

下面的示例代码修改自:

  • xdp-tutorial/basic01-xdp-pass/README.org at master · xdp-project/xdp-tutorial
  • xdp-tutorial/basic02-prog-by-name/README.org at master · xdp-project/xdp-tutorial

bpf程序的生命周期:open–create–attach–detach。

本文的 BPF ELF 文件中有两个XDP程序,可以选择按照名称加载。

首先是XDP程序。两个程序,分别是放行或者阻止数据包。

// xdp_kernel_prog.c
#include <linux/types.h>#include <bpf/bpf_helpers.h>
#include <linux/bpf.h>SEC("xdp")
int xdp_pass_func(struct xdp_md *ctx) {bpf_printk("%s", "Pkt pass...");return XDP_PASS;
}SEC("xdp")
int xdp_drop_func(struct xdp_md *ctx) {bpf_printk("%s", "Pkt drop...");return XDP_DROP;
}char _license[] SEC("license") = "GPL";

下面是加载XDP程序的用户层程序。

示例代码中,我使用了argp库,我喜欢用这个库来处理命令行参数。它的使用可见:一步步了解Argp-CSDN博客

#include <argp.h>
#include <net/if.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#include <bpf/libbpf.h>
#include <xdp/libxdp.h>#define PROG_NAME_MAXSIZE 32static char ifname[IF_NAMESIZE] = {};
static const char *filename = "xdp_kernel_prog.o";
static char prog_name[PROG_NAME_MAXSIZE] = {};
static volatile bool exiting = false;static int parse_opt(int key, char *arg, struct argp_state *state) {switch (key) {case 'd':snprintf(ifname, sizeof(ifname), "%s", arg);break;case 'p':snprintf(prog_name, sizeof(prog_name), "%s", arg);break;}return 0;
}static void sig_handler(int sig) { exiting = true; }int main(int argc, char *argv[]) {int ret = 0;struct bpf_object *obj;struct argp_option options[] = {{"dev", 'd', "DEV NAME", 0, "set the network card name"},{"prog", 'p', "program name", 0, "set the program"},{0},};struct argp argp = {.options = options,.parser = parse_opt,};argp_parse(&argp, argc, argv, 0, 0, 0);// check parameterprintf("choice dev: %s\n", ifname);int ifindex = if_nametoindex(ifname);if (ifindex == 0) {perror("if_nametoindex failed");exit(EXIT_FAILURE);}printf("%s's index %d\n", ifname, ifindex);/* Cleaner handling of Ctrl-C */signal(SIGINT, sig_handler);signal(SIGTERM, sig_handler);obj = bpf_object__open(filename);if (obj == NULL) {perror("bpf_object__open failed");exit(EXIT_FAILURE);}struct xdp_program_opts prog_opts = {};prog_opts.sz = sizeof(struct xdp_program_opts);prog_opts.obj = obj;prog_opts.prog_name = prog_name;struct xdp_program *prog = xdp_program__create(&prog_opts);if (prog == NULL) {perror("xdp_program__create failed.");exit(EXIT_FAILURE);}ret = xdp_program__attach(prog, ifindex, XDP_MODE_UNSPEC, 0);if (ret != 0) {perror("xdp_program__attach failed.");exit(EXIT_FAILURE);}while (!exiting) {sleep(1);}cleanup:struct xdp_multiprog *mp = xdp_multiprog__get_from_ifindex(ifindex);ret = xdp_multiprog__detach(mp);if (ret != 0) {perror("xdp_multiprog__detach failed.");exit(EXIT_FAILURE);}bpf_object__close(obj);
}

构建过程

构建过程还是稍微有点麻烦了。CMake文件修改自:libbpf-bootstrap/tools/cmake at master · libbpf/libbpf-bootstrap

cmake_minimum_required(VERSION 3.10)project(xdp-load-prog)find_package(PkgConfig)
pkg_check_modules(LIBBPF REQUIRED libbpf)
pkg_check_modules(LIBXDP REQUIRED libxdp)# Get clang bpf system includes
execute_process(COMMAND bash -c "clang -v -E - < /dev/null 2>&1 |sed -n '/<...> search starts here:/,/End of search list./{ s| \\(/.*\\)|-idirafter \\1|p }'"OUTPUT_VARIABLE CLANG_SYSTEM_INCLUDES_outputERROR_VARIABLE CLANG_SYSTEM_INCLUDES_errorRESULT_VARIABLE CLANG_SYSTEM_INCLUDES_resultOUTPUT_STRIP_TRAILING_WHITESPACE)
if(${CLANG_SYSTEM_INCLUDES_result} EQUAL 0)separate_arguments(CLANG_SYSTEM_INCLUDES UNIX_COMMAND ${CLANG_SYSTEM_INCLUDES_output})message(STATUS "BPF system include flags: ${CLANG_SYSTEM_INCLUDES}")
else()message(FATAL_ERROR "Failed to determine BPF system includes: ${CLANG_SYSTEM_INCLUDES_error}")
endif()set(BPF_C_FILE ${CMAKE_CURRENT_SOURCE_DIR}/xdp_kernel_prog.c)
set(BPF_O_FILE ${CMAKE_CURRENT_BINARY_DIR}/xdp_kernel_prog.o)
add_custom_command(OUTPUT ${BPF_O_FILE}COMMAND clang -g -O2 -target bpf ${CLANG_SYSTEM_INCLUDES} -c ${BPF_C_FILE} -o ${BPF_O_FILE}COMMAND_EXPAND_LISTSVERBATIMDEPENDS ${BPF_C_FILE}COMMENT "[clang] Building BPF file: ${BPF_C_FILE}")add_custom_target(generate_bpf_obj ALLDEPENDS ${BPF_O_FILE}
)add_executable(xdp_load xdp_loader.c)
target_link_libraries(xdp_load PRIVATE ${LIBBPF_LIBRARIES} ${LIBXDP_LIBRARIES})

运行

# 查看help信息
./xdp_load --help
Usage: xdp_load [OPTION...]-d, --dev=DEV NAME         set the network card name-p, --prog=program name    set the program-?, --help                 Give this help list--usage                Give a short usage messageMandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

放行指定网卡的所有数据包。

./xdp_load --dev=ens19 --prog=xdp_pass_func# 查看是否附加成功
xdp-loader status ens19
CURRENT XDP PROGRAM STATUS:Interface        Prio  Program name      Mode     ID   Tag               Chain actions
--------------------------------------------------------------------------------------
ens19                  xdp_dispatcher    native   403  4d7e87c0d30db711 =>              50     xdp_pass_func             412  2d69c152cb7a3b4b  XDP_PASS# 向网卡发送数据后,查看trace信息
cat /sys/kernel/debug/tracing/trace_pipe<idle>-0       [004] ..s2. 24810.751471: bpf_trace_printk: Pkt pass...<idle>-0       [004] ..s2. 24811.768707: bpf_trace_printk: Pkt pass...<idle>-0       [004] ..s2. 24815.992664: bpf_trace_printk: Pkt pass...

丢弃指定网卡的所有数据包。

./xdp_load --dev=ens19 --prog=xdp_drop_funcxdp-loader status ens19
CURRENT XDP PROGRAM STATUS:Interface        Prio  Program name      Mode     ID   Tag               Chain actions
--------------------------------------------------------------------------------------
ens19                  xdp_dispatcher    native   423  4d7e87c0d30db711 =>              50     xdp_drop_func             433  510776c6b1cf234d  XDP_PASScat /sys/kernel/debug/tracing/trace_pipe<idle>-0       [004] ..s2. 24902.015467: bpf_trace_printk: Pkt drop...<idle>-0       [004] ..s2. 24903.032696: bpf_trace_printk: Pkt drop...<idle>-0       [004] ..s2. 24907.128676: bpf_trace_printk: Pkt drop...<idle>-0       [004] ..s2. 24908.152674: bpf_trace_printk: Pkt drop...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubeadm搭建生产环境高可用集群

前言 搞了好多天&#xff08;今天是20240819&#xff09;&#xff0c;中途遇到各种各样的问题&#xff0c;总算是可以用了 我这里用的vmware开了5台服务器做学习实践 K8S因为直接使用的 pkgs.k8s.io 仓库&#xff0c;所以直接拉取的最新release版&#xff08;v1.31&#xff09…

SIRA-PCR: Sim-to-Real Adaptation for 3D Point Cloud Registration 论文解读

目录 一、导言 二、 相关工作 1、三维点云配准工作 2、无监督域适应 三、SIRA-PCR 1、FlyingShape数据集 2、Sim-to-real自适应方法 3、配准 4、损失函数 一、导言 该论文来自于ICCV2023&#xff0c;论文提出了一种新的方法SIRA-PCR&#xff0c;通过利用合成数据Flying…

网易云音乐故障 2 小时,这次到底谁背锅?(今天记得领补偿)

大家好&#xff0c;我是程序员鱼皮&#xff0c;8 月 19 日下午&#xff0c;网易云音乐突发严重故障&#xff0c;并登顶微博热搜&#xff0c;跟黑神话悟空抢了热度。 根据用户的反馈&#xff0c;故障的具体表现为&#xff1a;用户无法登录、歌单加载失败、播放信息获取失败、无法…

了解数据库中常用存储引擎数据结构(2)

目录 深入了解B树及其变种 BTree BTree B*Tree BTree并发机制 B-Link Tree 深入了解B树及其变种 先把我们要解释的B树变种都列出来&#xff0c;B树的变种主要有B树、B*树、B-Link树、COW B树、惰性B树、Bw树等。 下面具体来分析这些变种的优势和发展趋势。 BTree 下图…

Taro+Vue 创建微信小程序

TaroVue 创建微信小程序 一、全局安装 tarojs/cli二、项目初始化三、现在去启动项目吧 一、全局安装 tarojs/cli npm install -g tarojs/cli //安装 npm info tarojs/cli //查看安装信息 如果正常显示版本说明成功了&#xff0c;就直接跳到第二步吧官网说&#xff1a;…

AI产品经理如何入门?零基础入门到精通,收藏这一篇就够了

现在做产品经理&#xff0c;真的挺累的。 现在产品越来越难做&#xff0c;晋升困难&#xff0c;工资迟迟不涨……公司裁员&#xff0c;产品经理首当其冲&#xff01;&#xff01; 做产品几年了&#xff0c;还没升职&#xff0c;就先到了“职业天花板”。 想凭工作几年积累的…

BFS解决单源最短路问题

目录 迷宫中离入口最近的出口 最小基因变化 单词接龙 为高尔夫比赛砍树 迷宫中离入口最近的出口 题目 思路 使用宽度优先遍历解决这道题&#xff0c;需要一个二维数组标记是否被遍历过&#xff0c;也需要一个队列辅助完成宽度优先遍历&#xff0c;类似于水波纹一样&#x…

JAVA基础:File类

目录 前言 file对象的创建 file的常用方法 前言 file类表示的是系统中的一个文件或者文件夹 file类和系统中的文件或者文件夹不需要是一一对应的&#xff0c;我们可以在file类中写你系统中不存在的文件或文件夹 file类中存储的实际上是文件或文件夹的抽象路径&#xff0c…

面试经典算法150题系列-最长公共前缀

最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&…

软件测试 - 自动化测试(概念)(Java)(自动化测试分类、web自动化测试、驱动、selenium自动化测试工具的安装)

一、自动化的概念 ⾃动洒⽔机&#xff0c;主要通上⽔就可以⾃动化洒⽔并且可以⾃动的旋转。 ⾃动洗⼿液&#xff0c;免去了⼿动挤压可以⾃动感应出洗⼿液 超市⾃动闸⻔&#xff0c;不需要⼿动的开⻔关⻔ ⽣活中的⾃动化案例有效的减少了⼈⼒的消耗&#xff0c;同时也提⾼了⽣…

C语言程序设计(初识C语言后部分)

代码是一门艺术&#xff0c;键盘是我的画笔。 3.递归和迭代&#xff08;循环就是一种迭代&#xff0c;迭代不仅仅是循环&#xff09; 求n&#xff01; 递归方式&#xff1a; n!---> 1 (n1); n*(n-1)! (n>1) #include <stdio.h> //n!-->递归方式 int fac(in…

Kafka运行机制(一):Kafka集群启动,controller选举,生产消费流程

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501 1. Kafka集群启动 Kafka在启动集群中的各个broker时&#xff0c;broker会向controller注册自己&#xff0c;并且从controller节点同步集群元数据。 broker是Kaf…

C++入门——16C++11新特性

1.列表初始化 初始化列表时&#xff0c;可添加等号()&#xff0c;也可不添加。 struct Point {int _x;int _y; };int main() {int x1 1;int x2{ 2 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };// C11中列表初始化也可以适用于new表达式中int* pa …

jstack结果提取特定线程池线程的堆栈

这里假设你已经知道如何定位java进程PID&#xff0c;以及如何执行jstack命令进行导出&#xff0c;下面仅提供相关命令&#xff0c;及示例 ps aux|grep java jstack 8229 > jstack_output.log v1版本 grep second jstack_output.log 如果此时我们想重点关注一下下面这个线程…

高性价比全屋智能家居解决方案,提升生活幸福感!

在快节奏的城市生活中&#xff0c;公司、住宅两点一线的上班族不在少数。近年来&#xff0c;随着物联网、大数据技术的不断发展与5G的广泛普及&#xff0c;生活品质的提升成为上班族新的关注焦点。忙碌的工作时间结束后&#xff0c;智慧家居系统打造便捷、安全、智能、舒适的居…

(javaweb)SpringBootWeb案例(毕业设计)案例--部门管理

目录 1.准备工作 2.部门管理--查询功能 3.前后端联调 3.部门管理--新增功能 1.准备工作 mapper数据访问层相当于dao层 根据页面原型和需求分析出接口文档--前后端必须遵循这种规范 大部分情况下 接口文档由后端人员来编写 前后端进行交互基于restful风格接口 http的请求方式…

文书智能助手

背景 司法、医疗等行业存在着大量的文书&#xff0c;一份文书或者卷宗少则几十页&#xff0c;多则几万页。在查看和检查这些文书时&#xff0c;会遇到大量的信息。当需要查询进一步的详细内容时&#xff0c;往往需要选择一下文字&#xff0c;然后再在各种系统中 查询详细的信息…

日拱一卒(4)——leetcode学习记录:路径总和

一、任务&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶…

二叉树(四)

一、二叉树的性质 二、练习 1.某二叉树共有399个节点&#xff0c;其中有199个度为2的节点&#xff0c;则二叉树中的叶子节点数为&#xff08; &#xff09;。 A.不存在这样的树 B.200 C.198 D.199 答案&#xff1a;B 参考二叉树的性质第三条 2.在具有2…

【Hadoop】核心组件深度剖析:HDFS、YARN与MapReduce的奥秘

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《大数据前沿&#xff1a;技术与应用并进》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Hadoop简介 2、Hadoop生态系统概览 二、Hadoo…