DPDK程序结合网络助手接收数据

网络调试工具:https://download.csdn.net/download/hdsHDS6/88390999?spm=1001.2014.3001.5503

DPDK代码:

#include <stdio.h>
#include <string.h>
#include <rte_eal.h>
#include <rte_ethdev.h>
#include <rte_ip.h>
#include <rte_tcp.h>
#include <rte_udp.h>
#include <rte_mbuf.h>
#include <rte_mempool.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#define NB_MBUF 512
#define MAX_PKT_BURST 32
#define SELF_PROTO_TYPE 0x0888
static struct rte_eth_conf port_conf = {.rxmode = {.split_hdr_size = 0}
};
// cat /proc/interrupts
void init_port(struct rte_mempool *mbuf_pool){uint16_t nb_ports = 0;int ret = 0;int portid = 0;struct rte_eth_dev_info dev_info;struct rte_ether_addr addr;const int num_rx_queues = 1;const int num_tx_queues = 0;nb_ports = rte_eth_dev_count_avail();if(nb_ports == 0){rte_exit(EXIT_FAILURE, "No support eth found\n");}for(portid = 0; portid < nb_ports; portid++){ret = rte_eth_macaddr_get(portid, &addr);if (ret != 0){rte_exit(EXIT_FAILURE, "macaddr get failed\n");} printf("Port %u MAC: %02"PRIx8" %02"PRIx8" %02"PRIx8" %02"PRIx8" %02"PRIx8" %02"PRIx8"\n",portid, RTE_ETHER_ADDR_BYTES(&addr));ret = rte_eth_dev_info_get(portid, &dev_info);ret = rte_eth_dev_configure(portid, num_rx_queues, num_tx_queues, &port_conf);ret = rte_eth_rx_queue_setup(portid, 0, 128, rte_eth_dev_socket_id(portid), NULL, mbuf_pool);ret = rte_eth_dev_start(portid);if (ret < 0) {rte_exit(EXIT_FAILURE, "rte_eth_dev_start:err=%d, port=%u\n", ret, portid);}}   
}
/*发送方注意设置LP信息
*/
int
main(int argc, char **argv)
{int ret;unsigned lcore_id;int i = 0;int portid = 0;int nb_rx = 0;/* 初始化环境 */ret = rte_eal_init(argc, argv);if (ret < 0)rte_panic("Cannot init EAL\n");/* 创建内存池 */struct rte_mempool *mbuf_pool = rte_pktmbuf_pool_create("my pool", NB_MBUF, 32, 0,RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());if (mbuf_pool == NULL){return -1;}init_port(mbuf_pool);while(1){struct rte_mbuf* pkts_burst[MAX_PKT_BURST];nb_rx = rte_eth_rx_burst(portid, 0, pkts_burst, MAX_PKT_BURST);if(nb_rx == 0){sleep(1);continue;}// printf("recv data start : %d \n", nb_rx);for(i = 0; i < nb_rx; i++){// etherstruct rte_ether_hdr *hdr = rte_pktmbuf_mtod(pkts_burst[i], struct rte_ether_hdr *);// ip// printf("ether_type = %x \n", hdr->ether_type);if(hdr->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)){struct rte_ipv4_hdr *iphdr =  rte_pktmbuf_mtod_offset(pkts_burst[i], struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr));// updif(iphdr->next_proto_id == IPPROTO_UDP){// (struct rte_udp_hdr *)RTE_PTR_ADD(iphdr, sizeof(struct rte_ipv4_hdr));struct rte_udp_hdr* udphdr = (struct rte_udp_hdr*)(iphdr + 1);uint16_t length = ntohs(udphdr->dgram_len);*(char*)(udphdr + length) = '\0';struct in_addr addr;addr.s_addr = iphdr->src_addr;printf("src:%s:%d \n", inet_ntoa(addr), ntohs(udphdr->src_port));addr.s_addr = iphdr->dst_addr;printf("dst:%s:%d, %s \n", inet_ntoa(addr), ntohs(udphdr->dst_port), (char*)(udphdr+1));}else if(iphdr->next_proto_id == IPPROTO_TCP){struct rte_tcp_hdr* tcphdr = (struct rte_tcp_hdr*)(iphdr + 1);struct in_addr addr;addr.s_addr = iphdr->src_addr;printf("src:%s:%d \n", inet_ntoa(addr), ntohs(tcphdr->src_port));addr.s_addr = iphdr->dst_addr;printf("dst:%s:%d, date = %s \n", inet_ntoa(addr), ntohs(tcphdr->dst_port), (char*)(tcphdr+1));}}else if(hdr->ether_type == rte_cpu_to_be_16(SELF_PROTO_TYPE)){char *data =  rte_pktmbuf_mtod_offset(pkts_burst[i], char *, sizeof(struct rte_ether_hdr));printf("recv data: %s \n", data);}rte_pktmbuf_free(pkts_burst[i]);}}return 0;
}

Makefile文件

# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2010-2014 Intel Corporation# binary name
APP = recv# all source are stored in SRCS-y
SRCS-y := main.cPKGCONF ?= pkg-config# Build using pkg-config variables if possible
ifneq ($(shell $(PKGCONF) --exists libdpdk && echo 0),0)
$(error "no installation of DPDK found")
endifall: shared
.PHONY: shared static
shared: build/$(APP)-sharedln -sf $(APP)-shared build/$(APP)
static: build/$(APP)-staticln -sf $(APP)-static build/$(APP)PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)
CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
# Add flag to allow experimental API as l2fwd uses rte_ethdev_set_ptype API
CFLAGS += -DALLOW_EXPERIMENTAL_API
LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)ifeq ($(MAKECMDGOALS),static)
# check for broken pkg-config
ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
$(error "Cannot generate statically-linked binaries with this version of pkg-config")
endif
endifbuild/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)build:@mkdir -p $@.PHONY: clean
clean:rm -f build/$(APP) build/$(APP)-static build/$(APP)-sharedtest -d build && rmdir -p build || true

虚拟机设置

网络适配器2和3用于DPDK的绑定,并设置为桥接模式,使两个网口与物理机处于同一局域网

编译:

加载驱动绑定网卡:

#! /bin/basheth1=$1
eth2=$2
DPDK_PATH=$3
DPDK_KMOD_PATH=$4
if [ -z "$DPDK_PATH" ];thenDPDK_PATH="/root/dpdk-22.07/usertools"
fiif [ -z "$DPDK_KMOD_PATH" ];thenDPDK_KMOD_PATH="/root/dpdk-22.07/kmod"
fi# 关闭网口
ifconfig $eth1 down
ifconfig $eth2 down# 大页
echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages# 加载uio驱动
modprobe uio
insmod $DPDK_KMOD_PATH/igb_uio.ko intr_mode=legacy
# 加载kni驱动
insmod $DPDK_KMOD_PATH/rte_kni.ko kthread_mode=multiple# 绑定网口
$DPDK_PATH/dpdk-devbind.py -b igb_uio "$eth1" "$eth2"
$DPDK_PATH/dpdk-devbind.py -s

运行:

可以获取到端口1的MAC地址,因为在代码中是端口1在接收数据

windows上设置静态IP与MAC的映射

命令:

netsh i i show in

添加静态IP与MAC的映射

命令:

netsh  -c  "i  i" add neighbors  16  "192.168.1.7" "00-0c-29-c3-b0-c0"

arp -a

利用网络调试工具发送UDP数据:

本地主机地址要与DPDK绑定的网络适配器同属于一个局域网

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

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

相关文章

C++ YAML使用

C++工程如何使用YAML-cpp 一、前期准备工作 1、已安装minGW、cmake、make等本地工具。 2、下载YAML-cpp第三方开源代码(一定要下载最新的release版本,不然坑很多)。 3、生成YAML-cpp静态库 (1)在yaml-cpp-master下建立build文件夹; (2)在该文件夹下生成MakaFile文…

QCefView 简介

什么是QCefView QCefView 是为 Qt 开发的一个封装集成了CEF(Chromium Embedded Framework)库的Wdiget UI组件。使用QCefView可以充分发挥CEF丰富强大的Web能力&#xff0c;快速开发混合架构的应用程序。它不需要开发者理解CEF的细节&#xff0c;能够在Qt中更容易的使用CEF&…

【深蓝学院】手写VIO第4章--基于滑动窗口算法的 VIO 系统:可观性和 一致性--作业

0. 内容 T1. 参考SLAM14讲P247直接可写&#xff0c;注意 ξ 1 , ξ 2 \xi_1,\xi_2 ξ1​,ξ2​之间有约束&#xff08;关系&#xff09;。 套用舒尔补公式&#xff1a; marg掉 ξ 1 \xi_1 ξ1​之后&#xff0c;信息被传递到 L 1 和 L 2 L_1和L_2 L1​和L2​之间了。 T2. …

Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论&#xff0c;微…

动态规划-状态机(188. 买卖股票的最佳时机 IV)

状态分类&#xff1a; f[i,j,0]考虑前i只股票&#xff0c;进行了j笔交易&#xff0c;目前未持有股票 所能获得最大利润 f[i,j,1]考虑前i只股票&#xff0c;进行了j笔交易&#xff0c;目前持有股票 所能获得最大利润 状态转移&#xff1a; f[i][j][0] Math.max(f[i-1][j][0],f[…

51单片机可调幅度频率波形信号发生器( proteus仿真+程序+原理图+报告+讲解视频)

51单片机可调幅度频率信号发生器( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图4. 设计报告5. 设计资料内容清单&&下载链接***[资料下载链接](https://docs.qq.com/doc/DS1daV1BKRXZMeE9u)*** 51单片机可…

ARM day2

1-100的和 代码&#xff1a; .text .globl _start _start:mov r0,#0mov r1,#1 loop:cmp r1,#100bhi stopaddls r0,r1,r0add r1,r1,#1b loop stop:b stop .end结果&#xff1a; 思维导图&#xff1a;

C/C++字符函数和字符串函数详解————内存函数详解与模拟

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2 .memcpy函数 3.memmove函…

Tomcat 与 JDK 对应版本关系

对应关系 Tomcat版本 jdk版本11.0.x JDK 21及以后10.1.x JDK11及以后10.0.xJDK1.8及以后9.0.x JDK1.8及以后8.5.xJDK1.7及以后8.0.x JDK1.7及以后 查看对应关系方法&#xff1a; 登陆Tomcat官网&#xff1a;Apache Tomcat - Welcome! 结果&#xff1a;

【网络原理】初始网络,了解概念

文章目录 1. 网络通信1.1 局域网LAN1.2 广域网WAN 2. 基础概念2.1 IP2.2 端口号 3. 认识协议4. 五元组5. 协议分层5.1 分层的作用5.2 OSI七层模型5.3 TCP/IP五层&#xff08;四层&#xff09;模型 6. 封装和分用 1. 网络通信 计算机与计算机之间是互相独立&#xff0c;是独立模…

我的第一个react.js 的router工程

react.js 开发的时候&#xff0c;都是针对一个页面的&#xff0c;多个页面就要用Router了&#xff0c;本文介绍我在vscode 下的第一个router 工程。 我在学习react.js 前端开发&#xff0c;学到router 路由的时候有点犯难了。经过1-2天的努力&#xff0c;终于完成了第一个工程…

openGauss学习笔记-89 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用查询原生编译

文章目录 openGauss学习笔记-89 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用查询原生编译89.1 查询编译&#xff1a;PREPARE语句89.2 运行命令89.3 轻量执行支持的查询89.4 轻量执行不支持的查询89.5 JIT存储过程89.6 MOT JIT诊断89.6.1 mot_jit_detai…