DPDK — L3 Forwarding 与 PLM IP 地址匹配算法
创始人
2025-05-31 15:36:01
0

目录

文章目录

  • 目录
  • L3 Forwarding Application
  • 安装部署
    • 部署拓扑
    • 编译运行 L3fwd
    • 测试 L3 转发功能
    • 性能参数
  • 实现分析

L3 Forwarding Application

L3 Forwarding Application 是一个实现了 LPM(Longest prefix match,最长前缀匹配)路由选择算法的 IP 数据包转发应用程序。此外,它还实现了负载均衡和多路径转发等功能,以提高网络的吞吐量和性能。

rte_lpm 库提供了高效的 LPM 算法,可以在大规模路由表上快速查找路由。

安装部署

部署拓扑

                      |----------------||     l3fwd      ||                ||  eth1   eth2   |1.1.1.1 |----|------|----|  2.1.1.152:54:00:5E:8C:DF      |      |       52:54:00:A7:A7:F6/        \/          \/            \/              \52:54:00:4a:1f:6d   /                \   52:54:00:53:5a:d21.1.1.2   |                  |  2.1.1.2|--------|------|   |-------|-------||      eth1     |   |     eth2      ||               |   |               ||    server0    |   |    server1    ||---------------|   |---------------|

编译运行 L3fwd

  • 编译
$ cat dpdk.rc
export RTE_SDK=/opt/dpdk-18.08
export RTE_TARGET=x86_64-native-linuxapp-gcc
export DPDK_BUILD=${DPDK_DIR}/${RTE_TARGET}
export LD_LIBRARY_PATH=${RTE_SDK}/${RTE_TARGET}/lib:/usr/local/lib:/usr/lib:$ source dpdk.rc$ cd ${RTE_SDK}/examples/l3fwd
$ make
$ ll build/l3fwd
  • 指令行格式
    • -p PORTMASK:指定要使用的 Ports 的十六进制位掩码(Bitmap)。
    • -P:将所有 Ports 都设置为混杂模式,使得无论 Frame 的 dstMAC 是不是本地网卡都可以接收。
    • -E:启用精确匹配算法(Exact match)。
    • -L:启动最长前缀匹配算法(Longest prefix match)。
    • –config:指示 port、queue、lcore 的映射关系。
    • –eth dest:指示 PortX 的 dstMAC 地址。
    • –enable-jumbo:启用 Jumbo 数据帧。
    • –max-pkt-len:在启用 Jumbo 的前提下,以十进制表示最大的数据包长度。
    • –no-numa:禁用 NUMA 亲和。
    • –hash-entry-num:指示十六进制 HASH Entry 的数量。
./l3fwd [EAL options] -- -p PORTMASK[-P][-E][-L]--config(port,queue,lcore)[,(port,queue,lcore)][--eth-dest=X,MM:MM:MM:MM:MM:MM][--enable-jumbo [--max-pkt-len PKTLEN]][--no-numa][--hash-entry-num][--ipv6][--parse-ptype]
  • 运行
    • -l 1:只使用一个 lcore,因为测试机的网卡不支持多队列,而 l3fwd 会为每个 lcore 分配一个 Tx queue,所以只能使用 1 个 lcore,否则会在 rte_eth_dev_configure() 的时候失败。
    • 52:54:00:4a:1f:6d - server0 eth1 发出的 Frame 的 dstMAC 地址。因为 l3fwd 没有 ARP 协议,所以需要手动指定每个 Ports 的 dstMAC。
    • 52:54:00:53:5a:d2- server1 eth2 发出的 Frame 的 dstMAC 地址。
./build/l3fwd -l 1 -- -p 0x3 -P --config="(0,0,1),(1,0,1)" --parse-ptype --eth-dest=0,52:54:00:4a:1f:6d --eth-dest=1,52:54:00:53:5a:d2soft parse-ptype is enabled
LPM or EM none selected, default LPM onInitializing port 0 ... Creating queues: nb_rxq=1 nb_txq=1... Port 0 modified RSS hash function based on hardware support,requested:0xa38c configured:0Address:52:54:00:5E:8C:DF, Destination:52:54:00:4A:1F:6D, Allocated mbuf pool on socket 0LPM: Adding route 0x01010100 / 24 (0)
LPM: Adding route 0x02010100 / 24 (1)
LPM: Adding route IPV6 / 48 (0)
LPM: Adding route IPV6 / 48 (1)
txq=1,0,0Initializing port 1 ... Creating queues: nb_rxq=1 nb_txq=1... Port 1 modified RSS hash function based on hardware support,requested:0xa38c configured:0Address:52:54:00:A7:A7:F6, Destination:52:54:00:53:5A:D2, txq=1,0,0Skipping disabled port 2Initializing rx queues on lcore 1 ... rxq=0,0,0 rxq=1,0,0Port 0: softly parse packet type info
Port 1: softly parse packet type infoChecking link statusdone
Port0 Link Up. Speed 10000 Mbps -full-duplex
Port1 Link Up. Speed 10000 Mbps -full-duplex
L3FWD: entering main loop on lcore 1
L3FWD:  -- lcoreid=1 portid=0 rxqueueid=0
L3FWD:  -- lcoreid=1 portid=1 rxqueueid=0

测试 L3 转发功能

  • l3fwd_lpm.c 中定义的默认路由表,port0 为 1.1.1.0/24,port1 为 2.1.1.0/24。
static struct ipv4_l3fwd_lpm_route ipv4_l3fwd_lpm_route_array[] = {{IPv4(1, 1, 1, 0), 24, 0},{IPv4(2, 1, 1, 0), 24, 1},{IPv4(3, 1, 1, 0), 24, 2},{IPv4(4, 1, 1, 0), 24, 3},{IPv4(5, 1, 1, 0), 24, 4},{IPv4(6, 1, 1, 0), 24, 5},{IPv4(7, 1, 1, 0), 24, 6},{IPv4(8, 1, 1, 0), 24, 7},
};
  • server01:因为 l3fwd 不能处理 ARP 协议,所以需要手动添加 l3fwd port0 的静态 MAC 地址表。
$ ip addr add dev eth1 1.1.1.2/24
$ ip route add 2.1.1.2 via 1.1.1.1 dev eth1
$ ip nei add 1.1.1.1 lladdr 52:54:00:5E:8C:DF dev eth1
  • server02
$ ip addr add dev eth2 2.1.1.2/24
$ ip route add 1.1.1.2 via 2.1.1.1 dev eth2
$ ip nei add 2.1.1.1 lladdr 52:54:00:A7:A7:F6 dev eth2
  • server01 ping server02
$ ping 2.1.1.2
PING 2.1.1.2 (2.1.1.2) 56(84) bytes of data.
64 bytes from 2.1.1.2: icmp_seq=30 ttl=63 time=0.659 ms

性能参数

  • 10GbE、Intel x710、2NUMA、4ports

在这里插入图片描述

实现分析

相关内容

热门资讯

计算机组成原理实验1---运算...     本实验为哈尔滨工业大学计算机组成原理实验,实验内容均为个人完成,...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
前端-session、jwt 目录:   (1)session (2&#x...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
EL表达式JSTL标签库 EL表达式     EL:Expression Language 表达式语言     ...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
【Spring Cloud A... 文章目录前言Metadata元数据ClassMetadataSpring中常见的一些元注解Nacos...
React篇-关于React的... 一.简介1.介绍用于构建用户界面的 JavaScript 库2.创建项目(1)手动创建Documen...
win7 Pro 英文版添加中... win7pro x64英文版添加中文语言包1、下载语言包,并解压成lp.cab,复制到...
Android开发-Andro... 01  Android UI 1.1  UI 用户界面(User Interface,...
基于springboot教师人... 基于springboot教师人事档案管理系统【源码+论文】 开发语言:Jav...
编写软件界面的方式 本文重点解决如下问题:编写软件的界面有哪几种方式?通常情形下࿰...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
GO语言小锤硬磕十三、数组与切... 数组用来保存一组相同类型的数据,go语言数组也分一维数组和多维数组。 直接上代码看一下...
三级数据库备考--数据库应用系... 1.数据库应用系统设计包括概念设计、逻辑设计、物理设计3个步骤,每个步骤的设计活动按照...
prometheus数据持久化... https://segmentfault.com/a/1190000015710814 promet...
孩子用什么样的灯对眼睛没有伤害... 现代社会高速发展,越来越多的人开始重视身体健康,尤其是很多家长ÿ...
微软Bing GPT支持AI绘... 我想要一张图片:大象、珊瑚、火山、云朵我想要一张图片:亚特兰蒂斯...
最新!5月IPO受理数创今年新... IPO市场新动态。5月30日,共有4家IPO企业获得受理,其中创业板打破今年“0受理”现象,迎来首批...