DPDK源码分析之l2fwd

什么是L2转发

2层转发,即对应OSI模型中的数据链路层,该层以Mac帧进行传输,运行在2层的比较有代表性的设备就是交换机了。

当交换机收到数据时,它会检查它的目的MAC地址,然后把数据从目的主机所在的接口转发出去。

交换机之所以能实现这一功能,是因为交换机内部有一个MAC地址表,MAC地址表记录了网络中所有MAC地址与该交换机各端口的对应信息。某一数据帧需要转发时,交换机根据该数据帧的目的MAC地址来查找MAC地址表,从而得到该地址对应的端口,即知道具有该MAC地址的设备是连接在交换机的哪个端口上,然后交换机把数据帧从该端口转发出去。

1.交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射,并将其写入MAC地址表中。
2.交换机将数据帧中的目的MAC地址同已建立的MAC地址表进行比较,以决定由哪个端口进行转发。
3.如数据帧中的目的MAC地址不在MAC地址表中,则向所有端口转发。这一过程称为泛洪(flood)。
4.接到广播帧或组播帧的时候,它立即转发到除接收端口之外的所有其他端口。

DPDK-l2fwd做了什么

该实例中代码写死的网卡为promiscuous混杂模式,我的虚拟机的两个网卡是直连的,拓扑如下:

因此,dpdk-l2fwd中,port 0收到包会转发给port 1,port 1收到包也会转发给相邻端口port 0,下图port 0混杂模式收到29694508个包然后会把这些包都sent给port 1,port 1同样收到其他包后也会转发给port 0。

因此,dpdk l2 fwd这个例子展示了两个网卡在mac层成功的转发了数据包,后续我们会阅读源码并调试程序来看,dpdk是如何实现这一功能的。

Pktgen安装

pktgen-dpdk是用于对DPDK进行高速数据包测试的工具

使用的命令行参数如下:

-c  : 用于指定运行程序的CPU内核掩码。
-n  : 用来指定内存通道。
-s  : 如果你想用pktgen发送pcap文件  例如 [-s P:PCAP_file]  -s 0 : 1.pcap    0表示在第0个网卡,1.pcap及文件名
-P  : 启动所有网卡,并进入混杂模式,想指定特定网卡 用 -p mask
-m  : 指定lcore和port的映射关系 [1].0, [2].1 core1->port0 core2->port2

由于pktgen是基于dpdk进行开发的,因此选取的pktgen的版本和dpdk的版本一定是相互兼容的,我这边版本如下:

pktgen version:
pktgen-dpdk-pktgen-21.03.1

dpdk version:
20.11.4-rc1

安装过程严格按照install.md即可:

//1. 先升级一下gcc版本
sudo yum install centos-release-scl
sudo yum install devtoolset-7-gcc*
scl enable devtoolset-7 bash
which gcc 
gcc -version
//2. 安装libpcap
yum install libpcap
yum install dnf-plugins-core
yum install libpcap-devel
//3. 环境变量设置
export RTE_SDK=<DPDKinstallDir>
export RTE_TARGET=x86_64-native-linux-gcc
//4. make

这样就可以通过参数配置,指定port去发包了,下面我通过port0发包10000pkts/s,由于port0和port1直连,可以看到port 1收包10000pkts/s。

//core0为主控负责命令行接受,流量显示,消息调度
//core1->port0 core2->port1
./pktgen -l 0-2 -n 3 -- -P -m "[1].0, [2].1"
set 0 dst mac 00:0c:29:93:e6:be
set 0 count 10000
start 0

源码阅读

无情GDB

gdb并打印一些关键信息,加深l2fwd源码理解

l2fwd_parse_args

解析l2fwd转发的一些命令行配置,我这边配置的是set args -- -q 1 -p 0x3即:

l2fwd_rx_queue_per_lcore:每个逻辑核负责处理一个rx队列,后续可以看到网卡配置时一个网卡配置一个rx队列和tx队列,因此这个参数可以理解为一个逻辑核负责处理一个网卡。

l2fwd_enabled_port_mask:可用的的网卡port的掩码

timer_period:多长时间将统计信息输出到stdout中,缺省为10s

转发端口配置

两两一组互为转发,因为我这边就两个port0和port1:

port 0 转给port 1, port 1 转给port 0

这里面用到了rte_eth_devices[portid]->data.owner.id与RTE_ETH_DEV_NO_OWNER进行比较,代表该接管的网卡还没有被使用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DPDK(Data Plane Development Kit)是一个用于构建高性能数据平面应用程序的开源工具集。它提供了一组优化的库和驱动程序,可以在网络和协议栈的处理过程中加速数据包的转发和处理。DPDK 最初是为 Linux 环境设计开发的,但后来也提供了一些实验性的 Windows 版本。 DPDK 在 Windows 上的支持仍然处于实验性阶段。虽然可以在 Windows 上运行 DPDK,但仍然面临一些挑战和限制。首先,由于 Windows 内核和驱动程序的限制,与 Linux 环境相比,DPDK 在 Windows 上的性能可能会有所下降。其次,Windows 版本的 DPDK 目前仅支持少数的网络设备供应商,这意味着不是所有的网络硬件都能与 Windows 版本的 DPDK 兼容。此外,Windows 版本的 DPDK 需要使用特殊的驱动程序和堆栈,可能需要进行额外的配置和调整。 尽管 Windows 版本的 DPDK 还有一些限制,但它仍然为在 Windows 环境下构建高性能数据平面应用程序提供了一些可能性。对于现有的 Windows 网络设备供应商和应用程序开发者来说,DPDK 提供了一种加速数据包处理的方法,可以提高数据平面的性能和吞吐量。 总之,DPDK 是一个用于构建高性能数据平面应用程序的工具集,目前也有一些实验性的 Windows 版本。尽管 Windows 版本的 DPDK 还存在一些挑战和限制,但它仍然为 Windows 环境下的高性能数据平面应用程序开发提供了一些可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值