这个功能是由我同事针对特定测试需求在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;
157         eth = rte_pktmbuf_mtod(m, struct ether_hdr *);
159         /* 02:00:00:00:00:xx */
160         tmp = &eth->d_addr.addr_bytes[0];
161         *((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_portid << 40);
163         /* src addr */
164         ether_addr_copy(&l2fwd_ports_eth_addr[dest_portid], &eth->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地址如下,mac地址虽然做了调换但是替换的为l2fwd中写死的02:00:00:00:00:00地址:
在这里插入图片描述

新增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源码包我已经上传了,有需要的可以下载:
支持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中。

前言这个功能是由我同事针对特定测试需求在l2fwd脚本中二次开发的功能。用以支持l2fwd转发流量能够自定义指定用户输入的mac地址。今年初我同事因为各种原因离开公司和团队,谨以此博客来纪念我同事无私的奉献。并希望有同样功能诉求的人在看到这篇博客时,这个工具能对你们有所帮助。功能详解l2fwd脚本运行时会绑端口,将绑定的端口上的流量进行转发。但是仔细一想转发只是完成了一个流向转换的过程。以p...
l2fwd 是 dpdk 二层转发示例,它会将一个口收到的报文经过相邻口转发出去,在日常测试中经常用到。 下面我从源码入手,分析下 l2fwd 内部的工作原理。 l2fwd 初始化 eal 并解析参数 516 int 517 main(int argc, char **argv) 518 { 519 struct lcore_queue_conf *qconf; 520 struct rte_eth_dev_info dev_info; 521 int ret; 522 ui
适配dpdk-17.11.1,命令通过新增-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
l2fwd命令是一个用于测试网络性能的工具。它使用了 DPDK(Data Plane Development Kit)库来进行高效的数据包转发,可以在网络中测量吞吐量、延迟和丢包率等指标。 使用方法: l2fwd [EAL options] -- -p PORTMASK [-q NQ] 其中,PORTMASK 是用于选择要使用的端口的掩码,NQ 是要使用的队列数。例如,如果要使用端口 0 和 1,...
vmware启动上三个host:host1、host2、host3。host之间的网口通过虚拟交换机相连。 在host2上跑dpdk-l3fwd打通host1和host3之间的连接,组网如下: host1-port0(ens38:192.168.56.167)<---->(port0) (host2_l3fwd) 原作者:张云尧       出处:http://aidaiz.com/dpdk_l2fwd/ 本例中实现了相邻端口之间的相互转发。 比如一共4个端口可用,那么端口1收到数据后会转发给端口2,端口2收到数据后会转发给端口1,端口3和端口4也会相互转发。 设置环境变量
二层转发基础简介以太网基础CS: 载波监听MA:多点接入CD:碰撞检测MAC地址单播组播广播帧表ARPL2FDB冲突域广播域hub交换机二层转发原理源MAC地址学习VLANIVLSVL 根据OSI网络七层模型,第一层到第七层分别是物理层、链路数据层、网络层、传输层、会话层、表示层和应用层。在二层转发中,二层指的就是数据链路层,而第二层数据链路层负责的就是MAC地址,所以二层转发就是基于MAC地址进行数据包转发。 以太网基础 冲突检测:CSMA/CD(Carrier Sense Multiple Ac
适配dpdk-17.11.1,命令通过新增-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(Media Access Control 或 Medium Access Control)地址。这个地址理论上是固定的,但也可以修改,这次IT之家就介绍一下两种修改方法。 在修改之前,可以先确定一下要修改的网卡MAC地址,查询方法有很多种,比如: 1、在设置→网络和Internet→WLAN/以太网,如下...
set(CMAKE_SYSTEM_NAME Linux) message(STATUS "CC: \"$ENV{CC}\"") message(STATUS "CXX: \"$ENV{CXX}\"") message(STATUS "CMAKE_C_COMPILER: \"${CMAKE_C_COMPILER}\"") message(STATUS "CMAKE_CXX_COMPILER
1.pktgen简介   pktgen是一个位于linux内核层的高性能网络测试工具,由瑞士皇家理工大学的TSlab实验室的Robert Olsson开发的(现在应该不在皇家理工了),主要用来测试网络驱动与网卡设备,支持多线程,能够产生随机mac地址、IP地址、UDP端口号的数据包,pktgen 的作者使用多CPU处理器在不同的PCI总线(pci 、pcie等总线)上用千兆以太网卡做过测
前言:在以openstack云平台为基础架设上的虚机,要获得端到端三层网络pps性能测试最佳值,需要给虚拟机开启网卡多队列。在thinkcloud云平台上由于操作界面尚未继承网卡多队列的功能,因此需要到kvm中开启网卡多队列。 查看网卡网卡多对列: # ethtool -l eth0 Channel parameters for eth0: Pre-set maximums: RX: 0 TX:...
理解vegeta的压测原理和设计目的,并且以正确的姿势使用该工具。 解读vegeta的报告并通过笔者实际测试经验合理的设置压测参数。 学会使用vegeta压测https的GET请求和POST请求。(虽然vegeta的说明文档中也有写) 阅读本文你将无法知道什么: 本文不会详述网络测试整个模型,测试指标之间的关联性。如果你不太清楚如何进行网络测...