dpdk编译安装以及接收udp报文(基于ubuntu)

news2024/11/13 11:28:28

目录

1、编译

2、设置运行环境

3、使用dpdk接收udp报文

3.1、设置发送端arp信息

3.2、测试

3.3、代码

4、其他


1、编译

代码下载:

DPDK

下载版本:DPDK 19.08.2

export RTE_SDK=/root/dpdk-stable-19.08.2/

export RTE_TARGET=x86_64-native-linux-gcc

cd /root/dpdk-stable-19.08.2

./usertools/dpdk-setup.sh

选择39 x86_64-native-linux-gcc,回车后自动开始编译

2、设置运行环境

1、添加一个网卡,作为dpdk抓包网卡,设置桥接模式

2、修改虚拟机vmx文件将抓包网卡的virtualDev 由 e1000 修改 vmxnet3,因为 vmware 的 vmxnet3 支持多队列网卡

单队列网卡:在单队列网卡中,所有的网络中断和处理任务通常都由单个CPU核心处理,这可能会导致该核心的高负载和瓶颈。

多队列网卡:多队列网卡可以将网络流量分散到多个CPU核心上,这样可以避免单个核心过载,并提高整体系统的性能。

cat /proc/interrupts | grep 网卡名称

可以查看该网卡是多队列还是单队列,单队列只有一行,多队列有多行

3、设置巨页内存

dpdk巨页一般配置为2M和1G

修改/etc/default/grub文件,增加图中的内容

物理机:

default_hugepages=1G hugepagesz=1G hugepages=20 isolcpus=0-7

虚拟机:

default_hugepages=1G hugepagesz=2M hugepages=1024 isolcpus=0-2

执行update-grup,重启

4、

cd /root/dpdk-stable-19.08.2

./usertools/dpdk-setup.sh

执行43、44、45、46(填512)、47(填512)、49,执行49前,要把dpdk抓包网卡down掉(ifconfig ens160 down)

当使用DPDK绑定网卡后,该网卡会从Linux内核网络栈中解绑,并交由DPDK控制。这意味着网卡不再由操作系统的网络栈管理,因此使用ip a或ifconfig这样的命令将看不到这块网卡。

./usertools/dpdk-devbind.py --status可以看到dpdk绑定的网卡

3、使用dpdk接收udp报文

3.1、设置发送端arp信息

查看绑定网卡的ip和mac地址,加到报文发送端的arp中

在指定网卡上加上对应的arp信息

netsh -c i i add neighbors 19 192.168.1.5 00-0c-29-f2-de-8d

执行arp -a

3.2、测试

发送报文,dpdp可以接收到

3.3、代码

#include <rte_eal.h>
#include <rte_ethdev.h>
#include <rte_mbuf.h>
#include <stdio.h>
#include <arpa/inet.h>


#define NUM_MBUFS (4096-1) // 内存池中 mbuf 的数量
#define BURST_SIZE 32

int gDpdkPortId = 0;

static const struct rte_eth_conf port_conf_default = {
	.rxmode = {.max_rx_pkt_len = RTE_ETHER_MAX_LEN}
};

static void ng_init_port(struct rte_mempool *mbuf_pool) {
	//dpdk绑定的网卡数量
	uint16_t nb_sys_ports = rte_eth_dev_count_avail();
	if (nb_sys_ports == 0) {
		rte_exit(EXIT_FAILURE, "not support eth\n");
	}

	struct rte_eth_dev_info dev_info;
	/*获取以太网设备的配置和状态信息。它通常用于初始化网络设备、
	 *配置网络设备或者获取网络设备的状态信息。
	 *这里的端口号和网卡是一一对应的
	 */
	rte_eth_dev_info_get(gDpdkPortId, &dev_info);

	const int num_rx_queues = 1;	//接收队列个数
	const int num_tx_queues = 0;	//发送队列个数
	struct rte_eth_conf port_conf = port_conf_default;
	
	rte_eth_dev_configure(gDpdkPortId, num_rx_queues, num_tx_queues, &port_conf);
	// 0是0号接收队列
	// 128是队列长度
	if (rte_eth_rx_queue_setup(gDpdkPortId, 0, 128, rte_eth_dev_socket_id(gDpdkPortId), NULL, mbuf_pool) < 0) {
		rte_exit(EXIT_FAILURE, "Could not setup RX queue\n");
	}

	if (rte_eth_dev_start(gDpdkPortId) < 0) {
		rte_exit(EXIT_FAILURE, "Could not start\n");
	}

}


int main(int argc, char *argv[]) {
	/*dpdk初始化资源
	 *用于初始化 Environment Abstraction Layer (EAL)。EAL 是 DPDK 的一个核心组件,
	 *负责抽象和管理硬件和操作系统依赖性,使得上层应用可以在不同的硬件和操作系统上
	 *以统一的方式运行。
	 */
	if (rte_eal_init(argc, argv) < 0) {
		rte_exit(EXIT_FAILURE, "Error with EAL initialization\n");
	}

	//内存池,接收的数据存在该内存池中
	struct rte_mempool *mbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NUM_MBUFS,
			0, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
	if (mbuf_pool == NULL) {
		rte_exit(EXIT_FAILURE, "Could not create mbuf pool\n");
	}

	ng_init_port(mbuf_pool);
	while(1) {
		struct rte_mbuf *mbufs[BURST_SIZE] = {0};
		unsigned num_recvd = rte_eth_rx_burst(gDpdkPortId, 0, mbufs, BURST_SIZE);
		if (num_recvd > BURST_SIZE) {
			rte_exit(EXIT_FAILURE, "Error receive from eth\n");
		}

		unsigned int i = 0;
		for (i = 0; i < num_recvd; i++) {
			struct rte_ether_hdr *ehdr = rte_pktmbuf_mtod(mbufs[i], struct rte_ether_hdr*);
			if (ehdr->ether_type != rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)) {
				continue;
			}
			struct rte_ipv4_hdr *iphdr = rte_pktmbuf_mtod_offset(mbufs[i], struct rte_ipv4_hdr*, sizeof(struct rte_ether_hdr));
			if (iphdr->next_proto_id == IPPROTO_UDP) {
				struct rte_udp_hdr *udphdr = (struct rte_udp_hdr *)(iphdr + 1);

				//两个字节以上的变量是需要大小端转换
				uint16_t length = ntohs(udphdr->dgram_cksum);
				*((char*)udphdr + length) = '\0';


				struct in_addr addr;
				addr.s_addr = iphdr->src_addr;
				printf("src: %s:%d, ", inet_ntoa(addr), udphdr->src_port);
				addr.s_addr = iphdr->dst_addr;
				printf("dst: %s:%d, %s\n", inet_ntoa(addr), udphdr->dst_port, (char *)(udphdr+1));
				rte_pktmbuf_free(mbufs[i]);
			}
		}
		
	}
	
	return 0;
}

4、其他

1、设置中断对应的cpu

/proc/irq/是一个特殊的文件系统目录,它提供了一个接口来观察和配置内核中的中断请求(IRQ)相关信息。/proc/irq/目录下的每个子目录通常对应一个特定的IRQ号。

/proc/irq/57/smp_affinity文件允许你查看或设置中断号为57的IRQ在多处理器系统中的亲和性(affinity)。亲和性是指操作系统尝试将中断处理任务绑定到特定的CPU核心上,以提高处理效率和性能。

smp_affinity文件中的值是一个掩码(mask),用十六进制表示,它指定了处理该中断的CPU核心。每一个十六进制数字代表了4个位,因此一个数字可以表示4个CPU核心的开关状态。如果你看到smp_affinity文件中有32个十六进制数字,那么这表示该系统可能支持多达32 * 4 = 128个CPU核心。

例如,如果smp_affinity文件中的值是ff,那么它表示前8个CPU核心(因为ff在二进制中是11111111)都被允许处理这个中断。如果值是1,则只有第一个CPU核心被允许处理这个中断。

要绑定第5个cpu核心,则echo 10 > /proc/irq/57/smp_affinity

2、dpdk使用场景

dpdk+nginx,nginx不从内核协议栈收包,从dpdk收包,提升性能

dpdk+dns

提升路由器/交换机性能

防火墙

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

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

相关文章

[杂项] 判断一个C++程序是多少位数属于那种编译版本

C/C程序 使用Process Explore。找到运行的程序后双击。 在image可以看到程序的位数。 view→lower Pane View → DLLs。通过查看vc运行库的dll是否带d后缀可以判断该程序是debug版本还是release版本 dependcyWalker 使用 dependcyWalker 来查看程序的位数及编译版本。注意…

每日一练,java06

这里写目录标题 题目1.局部变量能否和成员变量重名&#xff1f;2.下面哪个不属于HttpServletResponse接口完成的功能&#xff1f;3.以下代码结果是什么&#xff1f;4.实现或继承了Collection接口的是&#xff08;&#xff09;知识点局部变量与成员变量重名equals与HttpServletR…

微服务实战系列之玩转Docker(七)

前言 在上一篇中&#xff0c;博主对通过docker registry完成私仓搭建的过程&#xff0c;进行了完整演示和说明。一个docker 环境&#xff08;比如desktop&#xff09;&#xff0c;一个registry镜像&#xff0c;准备好这样的“2件套”&#xff0c;就能换来一个私有仓库了。 简…

PLC 远程下载网关

一、 产品概述 SSF-BOX-100 是三石峰科技有限公司推出的工业级 PLC 远程下载网关&#xff0c;主 要用于 PLC 远程调试、程序上下载&#xff0c;为用户提供一种简单可靠的远程维护方案。 1.1 SGBOX 软件 SGBOX 软件是 SSF-BOX-100 网关的配套软件&#xff0c;可以查看设备状态…

FTP(File Transfer Protocal,文件传输协议)

文章目录 引言FTP管理工具FTP客户端FTP连接模式控制连接数据连接FTP命令/响应FTP命令FTP响应FTPSSFTP引言 FTP(File Transfer Protocal,文件传输协议)用于建立两台主机间的数据文件传输下载。使用客户/服务器(Client/Server)架构,基于TCP协议,服务端口为21。 FTP链接…

React搭建Vite项目及各种项目配置

1. 创建Vite项目 在操作系统的命令终端&#xff0c;输入以下命令&#xff1a; yarn create vite 输入完成以后输入项目名称、选择开发框架&#xff0c;选择开发语言&#xff0c;如下图所示&#xff0c;即可完成项目创建。 注意事项&#xff1a; 1. Node版本必须符合要求&…

linux nginx 命令记录,和转发

nginx: 查看配置文件&#xff1a;sudo find / -name nginx.conf 配置文件&#xff1a;/etc/nginx/nginx.conf 检查nginx.conf文件正确性 nginx -t -c /path/to/nginx.conf 或者 有nginx命令执行 nginx -t 查找nginx 可执行文件&#xff1a;which nginx /usr/sbin/nginx 安装Ng…

比 Xshell 还好用的 SSH 客户端,MobaXterm 太酷了!

由于需要连接远程 Linux 服务器&#xff0c;早期使用过 Putty&#xff0c;SecureCRT&#xff0c;后面主要使用 Xshell。 自从接触了 MobaXterm之后&#xff0c;个人感觉比 Xshell 更好用&#xff0c;堪称SSH客户端的神器啊&#xff01; MobaXterm 和 Xshell 的关系&#xff0…

几个小创新模型,Transformer与SVM、LSTM、BiLSTM、Adaboost的结合,MATLAB分类全家桶再更新!...

截止到本期MATLAB机器学习分类全家桶&#xff0c;一共发了5篇&#xff0c;参考文章如下&#xff1a; 1.机器学习分类全家桶&#xff0c;模式识别&#xff0c;故障诊断的看这一篇绝对够了&#xff01;MATLAB代码 2. 再更新&#xff0c;机器学习分类全家桶&#xff0c;模式识别&a…

AI绘画:艺术与科技融合的新篇章

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;正逐步改变着传统艺术创作的格局。从早期的简单模仿到如今的个性化创作&#xff0c;AI绘画不仅提升了艺术创作的效率和质量&#xff0c;还开辟了全新的应用场景和商…

Temu卖家必读:测评补单策略,提升销量与转化率!

拼多多旗下的跨境电商平台Temu&#xff0c;凭借其独特的广告和低价策略&#xff0c;迅速在美国市场站稳脚跟&#xff0c;并在欧美市场取得初步成功后&#xff0c;马不停蹄地迈向了更广阔的海外市场。去年七月&#xff0c;Temu正式进军亚洲市场&#xff0c;日本与韩国成为其首批…

免费SSL证书的安全性与获取指南

SSL证书是一种数字凭证&#xff0c;用于加密用户与网站之间的信息交换&#xff0c;以确保传输的数据不被第三方窃取。它像是一个数字版的密封印章&#xff0c;为数据的传输过程提供了一层保护膜。 免费的SSL证书通常由CA机构提供&#xff0c;它们同样可以提供基础数据的加密服…

MATLAB基础:图像绘制

今天我们继续学习MATLAB中图像的绘制。 平面图形 plot(x,y)&#xff1a; x和y为长度相同的向量&#xff0c;分别用于存储x坐标和y坐标数据。 plot(x1,y1,选项1,x2,y2,选项2,…,xn,yn,选项n)&#xff1a; 多组折线&#xff0c;可选择表示折线的属性&#xff0c;如颜色、线型…

Excel的“只读方式”有什么方法可以变为可直接编辑吗?

在日常工作中&#xff0c;我们经常遇到Excel文件被设置为“只读方式”的情况&#xff0c;这可能是由于文件权限设置、文件共享需要或文件被下载时自动设置为只读等多种原因造成的。然而&#xff0c;当需要修改或编辑这些文件时&#xff0c;我们就需要将其从“只读方式”转换为可…

LlamaIndex:向 LLM 添加个人数据

LlamaIndex 是您构建基于 LLM 的应用程序的友好数据助手。您可以使用自然语言轻松地获取、管理和检索私有数据和特定领域的数据。 LlamaIndex 是一个针对大型语言模型 (LLM) 应用程序的数据框架。GPT-4 等 LLM 在海量的公共数据集上进行预训练&#xff0c;开箱即用即可实现令人…

微凌客旅游管理系统uniapp源码搭建教程

一.搭建教程环境 系统环境&#xff1a;CentOS、 运行环境&#xff1a;宝塔 Linux 网站环境&#xff1a;Nginx 1.15.10 MySQL 5.6.46 PHP-7.1-7.3 常见插件&#xff1a;fileinfo &#xff1b; redis 三.系统搭建图片

优化算法|自适应大邻域搜索算法及MATLAB代码实现

回来填坑了&#xff0c;本篇推文将详细讲解ALNS算法求解VRP问题及MATLAB代码实现。 算法介绍 节约算法构造初始解 function routessaving_init(DistMatrix, Demand, Cap) C_EPS1e-1;Nsize(DistMatrix,1); routescell(numel(2:N),1); for i1:numel(routes) % 每个节点单独一条…

c生万物系列(继承)

上一节笔者用宏和文件模拟了封装&#xff0c;这一节笔者继续使用c语言模拟继承。 简单介绍就是&#xff1a;在结构体里面重新定义需要继承的结构体。 调用时&#xff0c;使用&obvir,可以想象我们定义数组*p&#xff0c;p表示该数组第一个成员&#xff0c;这是因为结构体声…

【教程】vscode添加powershell7终端

win10自带的 powershell 是1.0版本的&#xff0c;太老了&#xff0c;更换为powershell7后&#xff0c;在 vscode 的集成终端中没有显示本篇教程记录在vscode添加powershell7终端的过程 打开vscode终端配置 然后来到这个页面进行设置 查看 powershell7 的安装位置&#xff…

【计算机毕业设计】869渔具在线销售网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…