DPDK简单案例

dpdk简单实现 DPDK是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。 应用场景 也是简单介绍,随着对dpdk认识的深入,对应用的理解也会深入。 高性能网关:可以使数据通过dpdk而不经过内核的协议栈直达应用层,用以提升网关性能。dns可以这么做。 虚拟交换机:利用dpdk优秀的性能,跑一个虚拟的交换机或是路由器,以提升性能。 防火墙:对数据的出入口做一些限制。 先简单 阅读详情

        由于资源有限,笔者所选的DPDK环境为虚拟机。虚拟机搭建DPDK的教程网上较多,这里就不再赘述,下来主要说一下在学习过程中遇到的问题。

        通过B站看到铃声学院King老师一个关于DPDK接收数据100行代码实现视频,饶有兴趣的去听了一下,然后自己也跟着实现了代码。DPDK环境是在虚拟机搭建的,DPDK自带的example中的helloworld也能跑成功,但是我自己实现的代码可以成功编译,就是收不到网卡的数据。这个问题让我纠结了好几天,刚开始一直以为是我环境的问题,重新搭建了N个虚拟机版本,问题还是存在。我都要快放弃了,最后通过前同事(之前搞过DPDK)的帮忙,还是代码的问题,在初始化环境的时候少调用接口,加了代码后就成功收到网卡的数据包了。这件事也让我懂得了只要坚持,好运总会眷顾你,嘿嘿嘿!话不多说,直接上代码。

        DPDK代码简单如下:

#include <rte_eal.h>
#include <rte_ether.h>
#include <rte_ethdev.h>

#include <stdio.h>
#include <arpa/inet.h>

#define PRINT_MAC(addr)		printf("%02"PRIx8":%02"PRIx8":%02"PRIx8 \
		":%02"PRIx8":%02"PRIx8":%02"PRIx8,	\
		addr.addr_bytes[0], addr.addr_bytes[1], addr.addr_bytes[2], \
		addr.addr_bytes[3], addr.addr_bytes[4], addr.addr_bytes[5])


#define NUM_BUFS	(4096 - 1)
#define BURST_SIZE	128

void init_port(struct rte_mempool *mbuf_pool);

int gDpdkPortId = 0;

static struct rte_eth_conf dev_conf_default = {
	.rxmode = {
		.max_rx_pkt_len = RTE_ETHER_MAX_LEN,
	},
};

void init_port(struct rte_mempool *mbuf_pool)
{
	uint16_t nb_ports = rte_eth_dev_count_avail();
	if(nb_ports == 0)
	{
		rte_exit(EXIT_FAILURE, "No Support eth found\n");
	}

#if 0	
	struct rte_eth_dev_info devinfo;
	rte_eth_dev_info_get(gDpdkPortId, &devinfo);
#endif

	const int num_rx_queues = 1;
	const int num_tx_queues = 1;
	int ret = rte_eth_dev_configure(gDpdkPortId, num_rx_queues, num_tx_queues, &dev_conf_default);
	if (ret < 0) {
		rte_exit(EXIT_FAILURE, ":: cannot configure device: err=%d\n", ret);
	}
	
	ret = rte_eth_rx_queue_setup(gDpdkPortId, 0, 128, rte_eth_dev_socket_id(gDpdkPortId), NULL, mbuf_pool);
	if(ret < 0){
		rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup failed\n");
	}
	
	ret = rte_eth_tx_queue_setup(gDpdkPortId, 0, 128, rte_eth_dev_socket_id(gDpdkPortId), NULL);
	if (ret < 0)
	{
		rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup failed\n");	
	}
	
	ret  = rte_eth_dev_start(gDpdkPortId);
	if (ret < 0)
	{
		rte_exit(EXIT_FAILURE, "rte_eth_dev_start failed\n");		
	}
	
	struct rte_ether_addr addr;
	rte_eth_macaddr_get(gDpdkPortId, &addr);
	PRINT_MAC(addr);
}

int main(int argc, char *argv[])
{
	if(rte_eal_init(argc, argv) < 0)
	{
		rte_exit(EXIT_FAILURE, "Error with eal init\n");
	}
	
	struct rte_mempool * mbuf_pool = rte_pktmbuf_pool_create("mbuf pool", NUM_BUFS, 0, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
	
	if(mbuf_pool == NULL)
	{
		rte_exit(EXIT_FAILURE, "mempool creat failed\n");
	}
	
	init_port(mbuf_pool);
	
	while(1)
	{
		struct rte_mbuf *mbufs[BURST_SIZE];
		unsigned num_recvd = rte_eth_rx_burst(gDpdkPortId, 0, mbufs, BURST_SIZE);
		
		if(num_recvd > BURST_SIZE)
		{
			rte_exit(EXIT_FAILURE, "rte_eth_rx_brust failed\n");
		}
		
		if(num_recvd == 0)
			continue;
		
		unsigned 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))
			{
				struct rte_ipv4_hdr *iphdr = rte_pktmbuf_mtod_offset(mbufs[i], struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr));
				
				struct rte_udp_hdr *udphr = (struct rte_udp_hdr *)(iphdr + 1);
				
				if(iphdr->next_proto_id == IPPROTO_UDP && ntohs(udphr->dst_port) == 12345)
				{
					uint16_t length = ntohs(udphr->dgram_len);
					*(char *)(udphr + length) = '\0';
					
					struct in_addr addr;
					addr.s_addr = iphdr->src_addr;
					printf("src: %s:%d,", inet_ntoa(addr), ntohs(udphr->src_port));
					
					addr.s_addr = iphdr->dst_addr;
					printf("dst: %s:%d, data:%s\n", inet_ntoa(addr), ntohs(udphr->dst_port), (char *)(udphr + 1));
				}
			}
		}
	}
	
	return 0;
}

        Makefile就是用dpdk自带example中helloworld的Makefile修改一下源文件名跟生成目标文件即可。

         注:dpdk网卡需要收到数据,必须在本地绑定一条静态路由(管理员权限),命令如下:

        绑定静态路由成功如下:

        程序执行结果:

 终于大功告成!这几天的辛苦也算值得了。

【DPDK】dpdk样例源码解析之三:dpdk-l3fwd_001 dpdk-l3fwd示例源码介绍 阅读详情

相关推荐

DPDK 运行一个简单应用

本文介绍一下:在DPDK环境下,如何编译和运行一个简单的DPDK应用。

wanghaicheng0421的专栏 794

DPDK例程分析

1、Hello World例程 先搬一段代码,后面再逐步分析。 /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2014 Intel Corporation */ #include <stdio.h> #include <string.h> #include <stdint.h> #i...

`咸鱼梦想家`的博客 464

DPDK简单example的阅读——l2fwd

DPDK,l2fwd

少阁主的专栏 7094

DPDK - 通过源码安装dpdk并运行examples (by quqi99)

作者:张华 发表于:2021-08-11 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 前言 2016年通过源码安装过dpdk,但过时了,见: https://blog.youkuaiyun.com/quqi99/article/details/51087955/ 通过juju安装dpdk请参考此网页搜索dpdk字眼: https://blog.youkuaiyun.com/quqi99/article/details/116893909 本文是在ubuntu 20.04上通过dpdk安装

技术并艺术着 7842

DPDK ring简单说明

rte ring的创建是通过rte_ring_create()函数来实现的,这个函数的原型struct rte_ring * rte_ring_create(const char *name, unsigned count, int socket_id,unsigned flags)首先找到ring_list,ring_list是挂接在队列中的,根据ring不跨socket的原则,推断是每个socket都维护有一个这样的队列,具体就不去抠代码了,先主后次。其中的data指针就指向了创建的ring的地址。..

lingshengxiyou的博客 858

DPDK例子介绍

包含对DPDK所有例子的描述,通过该文档,能够详细理解DPDK中所有例子

DPDK系列之三DPDK介绍及简单应用

DPDK的基本介绍和HelloWorld的运行

fpcc的专栏 2651

从零构建2.4G无线通信系统:MSPM0G3507与NRF24L01的深度协同设计

本文详细介绍了基于MSPM0G3507微控制器与NRF24L01射频模块构建2.4G无线通信系统的深度协同设计方案。内容涵盖系统架构、SPI通信优化、功耗管理、抗干扰机制及中断/DMA高效利用,为工业物联网应用提供高可靠、低功耗的无线传输解决方案。

rice5的博客 820

基于DPDK的用户态协议栈简单实现

通过上述的过程,即能够实现对于DPDK接收UDP数据报的协议的解析,随后在进行数据的发送时,为了让客户端能够接收到数据需要将原始数据重新进行封装,为其分别添加UDP头,IP头,以及网络头,这三部分使其符合网络协议的要求,将其放入发送队列中,即可实现数据的发送。在这里三次握手的过程,通过状态机的方式实现状态的迁移。在DPDK从队列中读取的数据为网络中原始的数据包,如果想要获得真正的数据还需要对网络数据进行进一步的解析,同时在发送的过程中,还需要对数据进行进一步的封装以符合网络协议的具体的要求。

qq_47483226的博客 1134

KEIL 5.38如何手动安装ARM Compiler V5?完整配置流程分享

本文详细介绍了在KEIL 5.38环境下手动安装和配置ARM Compiler V5(AC5)的完整流程,解决历史遗留项目的兼容性问题。从获取安装包、环境变量设置到KEIL集成配置,逐步指导开发者完成AC5的部署,并提供了常见错误排查和性能优化建议,帮助开发者高效维护基于C编译器的老项目。

weixin_29168813的博客 628

AI搜索优化(GEO)实战指南:抢占智能对话流量入口

AI SEO,是针对生成式AI平台(如DeepSeek、豆包、Kimi等)的优化策略,旨在通过适配AI算法对内容的理解和引用逻辑,提升品牌在AI生成答案中的可见性与权威性,从而在对话式搜索场景中抢占流量入口。:强化内容经验性(Experience)、专业性(Expertise)、权威性(Authoritativeness)、可信度(Trustworthiness)内容需避免夸大描述,提供可验证的细节(如数据、用户评价)。

Baixue5209的博客 6775

DPDK trace 的简单使用

DPDK trace 的简单使用

大草的博客 1657

V2签名预装失败原因及解决方案

GOOGLE最新的GTS要求targetSdkVersion 大于30的APK必须使用V2及以上签名。 但实际在预装过程中,GTS测试会失败。 后面发现这是由于预装方式的原因造成的。原来的预装方式是使用APK,指定APK使用预签名的方式。Android.mk如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := DKTest LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_TAGS

zyfzhangyafei的专栏 6303

最简单的dpdk udp程序

dpdk udp程序

qq_38051998的博客 1254

雷达工程师避坑指南:STAP处理中,间歇采样转发干扰为什么这么难对付?

本文深入解析了STAP处理中间歇采样转发干扰(ISRJ)的挑战与应对策略。通过分析ISRJ的工作机制和自由度消耗问题,结合仿真数据对比,揭示了其与传统压制干扰的本质差异。文章还探讨了在工程实践中如何构建有效的防御体系,包括降维处理技术选择和混合架构设计,为雷达工程师提供了实用的避坑指南。

weixin_30530339的博客 267

OpenEuler22.04 快速部署Docker:华为云镜像源配置指南

本文详细介绍了在OpenEuler 22.04系统上快速部署Docker的完整流程。针对系统默认源版本老旧的问题,重点讲解了如何配置华为云镜像源以加速安装,并涵盖Docker引擎、Docker Compose的安装、服务启动验证、权限配置、镜像加速等核心步骤与常见问题排查,帮助用户高效搭建稳定的容器化开发环境。

http9protocoller的博客 173

Ovs+Dpdk简单实践

Ovs+Dpdk简单实践 SDNLAB君 •16-04-20 •4557 人围观 一、Dpdk简介 Dpdk是X86平台报文快速处理的库和驱动的集合,不是网络协议栈,不提供二层,三层转发功能,不具备防火墙ACL功能,但通过DPDK可以轻松的开发出上述功能。优势在于通过Dpdk,可以将用户态的数据,不经过内核直接转发到网卡,实现加速目的。主要架构如图1.1所示。在intel的大

hanyingzhong的专栏 3765

AI大模型探索之路-认知篇1-全景透视:揭秘AIGC技术的进化之路

随着人工智能技术的突飞猛进,内容创作方式的发生了革命性的转变;从早期专业人员主导的内容生产,到现如今生成式人工智(AIGC)能创作时代;本篇文章主要讲解AIGC技术的演变历程。

寻道AI,探索AI无限可能! 1647

简单理解DPDK

本文介绍了DPDK(数据平面开发套件)的核心概念、配置流程及常见问题解决方法。主要内容包括: DPDK基础概念: 采用用户态驱动绕过内核协议栈,提升网络吞吐量 支持RDMA高速数据同步和eBPF性能分析工具 使用UDP协议进行客户端与DNS服务器通信 详细配置流程: 环境配置(巨页内存、网卡绑定、驱动加载) 不同Linux内核版本的编译差异处理 VFIO权限问题及IOMMU组冲突解决方案 实践应用: 提供了网络协议栈实现示例代码 解析了ARP协议工作原理及手动配置方法 给出了UDP测试程序框架及数据包处理逻

m0_51680688的博客 1617

笔试题-2023-芯原-数字前端设计or验证【纯净题目版】

笔试题-2023-芯原-数字前端设计or验证【纯净题目版】

w0shishabi的博客 5685

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

DPDK安装与简单使用

DPDK安装与简单使用 1.dpdk安装 0)为确保DPDK安装成功,程序正常编译使用,安装前应执行如下命令,安装程序依赖 yum update yum install libpcap-devel kernel* 之后关闭虚拟机再新添加一个网卡。 1)下载dpdk安装包:(版本:DPDK17.11.2 LTS) wget https://dpdk.org/rel/dpdk-...

Silvester123的博客 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

dpdk中文-dpdk简单介绍

bestboyxie话说DPDK~~其实dpdk中文文档太少了,好多大神都不愿意分享,所以我如果不写对不起谢大神名号啦~~ DPDK = Data Plane Development Kit  数据平面开发套件,说白了就是做数据通讯的SDK。以前传统的数据平面实现主要是以一下几种形态出现; 1、早期linux内核转发;使用linux内核协议栈实现二三层转发。使用netfite

bestboyxie的专栏 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

dpdk原理,dpdk编译与环境搭建,dpdk简单示例

绑定网卡,大页,mempool,PCI,NIC,自旋锁,mmap,ring,Mbuf

weixin_40355471的博客 2472

最简单的释放DPDK程序使用的Hugepages的方法

DPDK hugepage 释放

weixin_39053008的博客 688

[tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研

[tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研 如题,以下是一份简单的快速调研。   TLDK: Transport Layer Development Kit 一 什么是TLDK transport layer development kit 处理tcp/udp的库 不提供socket api 构建在dpdk的上层。 ...

yxy435的博客 2530

DPDK简单介绍

跟DPDK打交道时间也不短了,一直处理的是它

whut_gyx的专栏 7万+
上一篇: epoll模型实现及惊群效应
下一篇: 搭建ftp服务器注意事项
码农诗人
博客等级 码龄11年 986粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值