当前位置: 首页 > news >正文

DPDK数据面收包过程

分阶段明确两端角色:
1、收包 burst 阶段(硬件 DMA 环)
生产者 NIC 网卡 DMA 硬件
消费者:rx_thread(CPU)
2、rte_ring 传递阶段(软件无锁环)
生产者:rx_thread(CPU)
消费者:worker 线程(CPU)
以下代码是第 1 阶段。

/* 轮询网卡接收报文,mbuf 送入无锁 rx_ring 完全不解析控制命令,只处理业务数据帧 1、网口收到报文 -> NIC DMA 硬件把报文写入 mbuf 物理内存,更新硬件 RX 描述符 2、rte_eth_rx_burst() CPU 线程去 poll 硬件desc ring,拿到已填好的 mbuf 3、软件做 vlan 过滤,丢弃不匹配的报文 4、把合法的 mbuf 指针 push进 rte_ring(软件无锁队列,只存指针) 5、worker 线程从 rte_ring 取出 mbuf 指针,处理报文 6、worker 线程处理完调用 rte_pkt_mbuf_free 归还 mbuf 到 mempool */staticintdata_plane_rx_thread(void*arg){RTE_SET_USED(arg);printf("[DataPlane] RX thread start\n");structrte_mbuf*bufs[32];while(1){// 从网卡硬件Rx队列批量收包uint16_tnb_rx=rte_eth_rx_burst(g_port_id,0,bufs,32);if(nb_rx>0){for(inti=0;i<nb_rx;i++){structrte_mbuf*m=bufs[i];uint16_tvlan=rte_vlan_get_vlan(m);if(vlan!=g_dev_cfg.target_vlan){rte_pktmbuf_free(m);continue;}// 推入无锁ring,交给worker处理rte_ring_enqueue(rx_ring,m);}}rte_pause();}return0;}

DPDK 大页内存

/* 1、struct rte_mbuf 报文描述头对象,这个结构体本身的地址,是用户态虚拟地址 2、mbuf 结构体 + 报文 buffer(payload) 是连续存在一个 mempool 对象里面,都在大页内存 3、mempool 大页内存:同时可供 DMA 硬件 + 用户进程 CPU 访问 */structrte_mbuf{void*buf_addr;// 虚拟地址VA:CPU访问报文数据用rte_iova_tbuf_iova;// IOVA物理地址:DMA硬件使用// ...}/* 1、m 这个指针的值,就是 struct rte_mbuf 实例的用户态虚拟地址 2、CPU通过这个虚拟地址访问 mbuf 里各个成员:buf_addr、buf_iova、data_off 3、struct rte_mbuf(元数据头):只有 CPU 访问,硬件不碰;地址是用户虚拟地址。 4、payload 报文缓冲区:CPU (VA)、网卡 DMA (IOVA) 两边都访问,这块才是 DMA‑coherent 内存。 5、默认情况下,mbuf 结构体和 payload 缓冲区在 mempool 里面物理连续的一大块大页: 6、硬件只往 payload 部分 DMA 写数据; 7、mbuf 结构体那一段,硬件根本不去碰。 */structrte_mbuf*m=rte_pkt_mbuf_alloc(pool)
【rte_mempool】 ├─大页整块内存 │ ├─mbuf#0structrte_mbuf{buf_addr,buf_iova,...}+紧随其后的报文buffer │ ├─mbuf#1structrte_mbuf{buf_addr,buf_iova,...}+紧随其后的报文buffer │ └─mbuf#2structrte_mbuf{buf_addr,buf_iova,...}+紧随其后的报文buffer

RX 描述符环,是网卡硬件自己维护的一块内存

// 网卡硬件RX Descriptorstructrx_desc_hw{rte_iova_tbuf_iova;// DMA写入的IO物理地址,CPU填入uint64_tstatus;// 硬件写:收包完成、包长度、错误标记};

整个 RX ring 就是一个数组,头尾循环,形成环

rx_desc_hw desc_ring[DESC_NUM];// 环形数组,比如512个描述符head(硬件指针)↓ ┌─────┬─────┬─────┬─────┬─────┬─────┐ │desc0│desc1│desc2│desc3│desc4│desc5│ └─────┴─────┴─────┴─────┴─────┴─────┘ ↑tail(CPU软件指针)head:网卡硬件维护指针:硬件下一个要用的描述符位置;硬件顺着 head 填报文、更新 status。 tail:CPU 软件维护指针:CPU 下一个要填充新 buffer 的位置。

1 个硬件 RX 描述符,对应 1 个 struct rte_mbuf*,对应 bufs[] 里面的一个元素 bufs[i]。

http://www.jsqmd.com/news/1403961/

相关文章:

  • VisualCppRedist AIO:5 分钟一键修复全部 Visual C++ 运行库缺失的终极指南
  • 暗黑2存档编辑器完整上手指南:从零到可视化修改角色与装备
  • 2026信阳有实力的宠物牙专科行业实用参考指南 - 谁都没有我好看
  • 开源 Agent 工具链成本评估:延迟、调用量和维护成本一起算
  • 5秒无损搞定m4s转mp4:m4s-converter,把B站缓存视频变成你的永久收藏
  • Kali Linux忘记用户名?3种方法找回并深入解析Linux身份验证机制
  • Arduino PWM控制直流风扇:从原理到实践的零基础入门教程
  • 解决Docker客户端版本高于服务端的API兼容性问题
  • Python文件读取全解析:read、readline、readlines与for循环的深度对比与实战选型
  • 2026信阳正规宠物绝育医院服务精选指南 - 谁都没有我好看
  • 区块链安全周报:DeFi漏洞、AI威胁与实战防御体系解析
  • Bebas Neue 开源字体完全指南:从零开始用免费商用标题字体打造高级感设计
  • 快速搞定专业教材编写!AI写教材工具,自动生成内容且查重率低至8%! - AI写论文
  • 彻底解决Windows DLL卸载残留:从原理到实战清理指南
  • 泰安房屋渗水如何妥善修缮,四位本地防水服务商实地走访体验记录 - 用户198513
  • Roblox开发实战:Lua脚本优化、性能提升与网络同步架构设计
  • AI辅助学术PPT制作:GPT-5.6与Codex协同工作流实践
  • 易灵思 DSP48 Block 详解
  • ( 2026、8月份最新 )香港防水补漏实测:梅雨季台风天房屋渗水反复?避坑看完这篇 - 宅仕达
  • 让 Unitree GO2 听懂 ROS2:一条命令完成连接、建图与多机协同的完整落地路线
  • 刷题 Agent 的快与省怎么量:固定题集、并发闸门和取消语义
  • Maven依赖下载失败:系统化排查与解决方案全解析
  • 腾讯WorkBuddy与OpenClaw框架:AI Agent如何重塑企业自动化与协同办公
  • 接口超时问题全解析:从分类诊断到Nginx优化实战
  • 免费开源的Markdown阅读器完整指南:5分钟装好,6大解析器与30+主题一次讲透
  • 专业干货!AI教材写作技巧与工具推荐,高效完成高校教材编写 - AI写论文
  • 古驰与万国在黄河畔的回收选择——兰州名品变现实录 - 你就像风一样
  • DeepSeek API涨价350%:价格屠夫收刀,本地部署才是真答案?
  • WPF GroupBox控件样式自定义:从ControlTemplate到现代化界面设计
  • AI辅助网络安全实战:从零构建自动化漏洞挖掘工作流