如何在DPDK 盒子上使用TRex

1. 接线

使用HDMI线连接盒子与显示器,将其中一个网络端口(下文以ETH0为例)接入有线网,并将电源插入电源接口,将USB外接键盘插入盒子的USB接口。DPDK盒子及接口示意图如图1所示。

2. 启动登录

接通电源后,待盒子里的系统启动完毕,输入用户名和密码:
用户名: test 密码:tester

3. 登陆后获取根用户权限

这里会提示需要输入密码,密码同上:tester

4. 安装igb网卡驱动

a. 使用其他电脑设备将igb 驱动下载保存至USB存储设备,并将其拷贝至盒子[1]。igb驱动下载链接:
https://sourceforge.net/projects/e1000/files/igb%20stable/5.3.5.15/
进入页面后下载对应版本的压缩包文件。
b. 安装:

5. 将接入有线网的端口绑到igb驱动上

a. 查看端口状态信息,如图2所示:

图2 端口状态信息(绑定igb_uio驱动)

b. 绑定igb驱动:

从图3可以看到,02:00.0口被绑到了igb上,接口名为eth0

图3 端口状态信息(绑定igb驱动)

6.为eth0设置动态分配IP地址:

7.设置网络代理

8.从Github上下载 TRex

9.安装TRex必需的库

(如果提示由于网络问题yum install 失败, 编辑/etc/yum.conf, 加上一行设置代理: proxy= xxx)

10.配置Trex使用的端口

不论实际使用1个还是多个端口,TRex需要至少两个端口,因此需要将绑到igb驱动的eth0绑回到原来的igb_uio(内核空间的驱动)上:

11.编辑TRex的配置文件

(注意yaml文件的缩进格式)
在/trex-core/scripts/cfg下有一些配置文件示例可供参考。
也可使用TRex中的脚本dpdk_setup_ports.py来创建一个简单的文件,内容如图4所示。具体如何创建配置文件请参考TRex的官方网站[2]。

图4 配置文件示例

12.配置并编译TRex

13.启动 TRex 服务器端

结果如图5所示:

(盒子的两个端口都需要有连接,不然会报错,详细的命令行参数请参考官方网站[2],另hugepage错误参见[3])

图5 启动TRex服务器端结果示意图

14.启动TRex客户端

(由于当前终端被服务器端占有,切换新的终端用来启动TRex客户端:CTRL+ALT+F2,CTRL+ALT+F1可切换回TRex服务器端)

  • trex> help(帮助命令,显示所支持的命令,如:发包命令start,停止发包stop,图形化显示命令tui)
  • trex> start -h (对于每条命令,加上-h或–help可以显示具体的帮助信息)

TRex客户端发包示例命令:

(如果将ETH0和ETH1用网线互连,则该命令可实现从 port 0发送64 bytes长度的数据包到 port 1,结果如图6和图7所示。具体的参数用法参见start -h,下面给出该示例参数的含义。)
其中,-f表示加载的发包脚本文件,这里指定了文件stl/bench.py;
-t表示发包脚本bench.py可传递的参数,这里指定了数据包长度size=64,Virtual OS模式vm=cached;
-p或 –port表示发包端口,这里指定从0号端口发包;
-m 或 –multiplier表示发包速率,这里指定用线速的100%发包。

图6 TRex启动客户端后客户端结果示意图

图7 TRex启动客户端后服务器端结果示意图

15.编辑自己的发包脚本

步骤14指定发包脚本为bench.py,而用户可以参照示例根据需求编辑自己的发包脚本。scripts/stl目录下包含多种发包脚本示例,各个脚本的具体写法和用法参见
https://github.com/cisco-system-traffic-generator/trex-core/blob/master/doc/trex_stateless.asciidoc
接下来,以stl/udp_1pkt_simple.py为例稍作介绍。

其中register()和get_streams()两个函数是必须定义的。
STLPktBuilder()是构造数据包的函数,会构造出pkt数据包,并以mode模式进行发包。Trex采用scapy构造数据包,因此数据包pkt的构造与scapy一致,通过layer的叠加从而达到构造数据包的目的。scapy构造数据包的具体规则参见:http://scapy.readthedocs.io/en/latest/
STLTXCont()是连续发包模式,可携带参数指定发包速率,默认是10 pps。此外,还有STLTXSingleBurst()和STLTXMultiBurst()两种模式。模式的函数定义在rex库中,如果感兴趣,可以阅读注释了解更详细的内容:scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py

[1] 从外接USB设备拷贝文件:

  • 插入USB设备后,可以使用 dmesg 命令找到设备的路径。
  • 以/dev/sdb1 为例,挂载该设备: mount /dev/sdb1 /mnt
  • 加载后用常规的命令将文件拷贝至任意路径 (cp, mv等)
  • 拷贝完毕后,取消USB设备挂载并拔除: umount /mnt

[2] TRex 官方手册: https://trex-tgn.cisco.com/trex/doc/trex_manual.html#

[3] 如何解决 hugepage相关报错:
在TRex的dpdk-setup_ports.py 脚本中,有hugepage配置函数config_hugepages()
由于盒子本身的空间不够会导致hugepage配置失败,该函数会报错。 可以将 “wanted_count = 2048” 中的数字改小, 如:“wanted_count = 512”, 从而使hugepage配置成功。

作者:

李晓云
Intel 软件工程师
主要从事DPDK PMD的开发工作

原文地址:DPDK开源社区

发表评论

电子邮件地址不会被公开。 必填项已用*标注