l2fwd--增加自定义修改目的mac地址功能

前言

这个功能是由我同事针对特定测试需求在l2fwd脚本中二次开发的功能。用以支持l2fwd转发流量能够自定义指定用户输入的mac地址。今年初我同事因为各种原因离开公司和团队,谨以此博客来纪念我同事无私的奉献。并希望有同样功能诉求的人在看到这篇博客时,这个工具能对你们有所帮助。

原生l2fwd缺陷详解

以dpdk18的版本为例。l2fwd脚本运行时会绑端口,将绑定的端口上的流量进行转发。但是仔细一想转发只是完成了一个流向转换的过程。在l2fwd文件夹的main.c文件中可以看到代码如下:

151 static void
152 l2fwd_mac_updating(struct rte_mbuf *m, unsigned dest_portid)
153 {
154         struct ether_hdr *eth;
155         void *tmp;
156 
157         eth = rte_pktmbuf_mtod(m, struct ether_hdr *);
158 
159         /* 02:00:00:00:00:xx */
160         tmp = ð->d_addr.addr_bytes[0];
161         *((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_portid << 40);
162 
163         /* src addr */
164         ether_addr_copy(&l2fwd_ports_eth_addr[dest_portid], ð->s_addr);
165 }

在l2fwd处理转发时,会把目的mac地址统一的更新为02:00:00:00:00:00。这样会导致一个问题就是当流量到l2fwd时,l2fwd更新目的mac地址之后,测试流量并不能正常的返回到源测试端。

当使用例如ixia,sprint打流仪器来发送二层包时,无法正确的调换包内mac地址会造成不必要的麻烦。虽然ixia和sprint打流仪可以很好的自定义包结构和包数据能很好的规避这种问题。

以pktgen-dpdk产生的流量为例,pktgen-dpdk发送的是三层网络包。所以报文具有三层网络的特性,报文中包含源IP,源mac地址,目的IP,目的mac地址。当l2fwd处理从pktgen-dpdk发送过来的报文时,只会将报文从绑定的端口原路返回。这也就意味着报文中源IP,源mac地址,目的IP,目的mac地址并不会做调换。

我们这里通过转发来实际看一下原生l2fwd的弊端。设计的测试场景为一台虚机使用pktgend-dpdk单网卡发包,另外一台虚机启动dpdk单网卡来做转发。在启动了dpdk虚机的网卡port上进行抓包。
l2fwd--增加自定义修改目的mac地址功能_第1张图片
原生l2fwd转发包的源目的mac地址如下,mac地址虽然做了调换但是替换的为l2fwd中写死的02:00:00:00:00:00地址:
l2fwd--增加自定义修改目的mac地址功能_第2张图片

新增destination-mac-update功能说明

在l2fwd中新增了-d参数,用于支持将dmac手动输入到l2fwd中,并使转发包持续的转发我手动输入的mac地址。

命令通过新增-d指定端口的dmac:
# ./build/l2fwd -c 3 -n 2 -- -p 3 -d 11:11:11:11:11:11 -d 22:22:22:22:22:22

Port0的dmac为: 11:11:11:11:11:11
Port2的dmac为: 22:22:22:22:22:22

运行时输出信息增加了port的用户指定dmac显示:
…
Initializing port 0... done:
Port 0, MAC address: 52:54:00:46:8D:C0

Initializing port 1... done:
Port 1, MAC address: 52:54:00:F0:6C:50

Port 0, Destination MAC address: 11:11:11:11:11:11
Port 1, Destination MAC address: 22:22:22:22:22:22

这里我将mac地址指定为vm1网卡的mac地址fa:16:3e:5a:d5:99。通过在vm2抓包可以看到是否实际生效。
l2fwd--增加自定义修改目的mac地址功能_第3张图片

修改过后的l2fwd源码包我已经上传了,有需要的可以下载:
支持dpdk17版本的l2fwd:https://download.csdn.net/download/minxihou/10857596
支持dpdk18版本的l2fwd:https://download.csdn.net/download/minxihou/10857603

该功能在dpdk17的版本中添加,所以会原生支持dpdk17。下载了dpdk17的源码包解压之后会有个l2fwd_dmac_v17111.diff的文件,该文件就是对比了dpdk17源码包原生l2fwd和追加了dmac功能的l2fwd的diff对比文件。找到增加的方法同样也可以移植到dpdk18的l2fwd中。

你可能感兴趣的:(网络,网络性能测试)