Page 92 - 《软件学报》2020年第9期
P. 92
张雯雯 等:SDN 数据平面软件一致性测试用例生成方法 2713
• p4pktgen [10] 是一个可以为 P4 程序自动化生成测试用例的开源工具. p4pktgen 不直接依赖 P4 程序,而
是解析 P4 程序经编译后的 JSON 格式文件,并为给定程序中的路径生成数据包和表配置,用户可以选
择生成所有路径的测试用例,也可以生成优先考虑分支覆盖范围的测试用例.随后, p4pktgen 配置
BMv2 交换机、发送测试包并验证数据包的转发是否和预期的路径一致.p4pktgen 支持 P4 14 和 P4 16 两
个版本的 P4 程序,其功能上尚且有一些没有修复的 bug,生成的数据包不能随 P4 程序更新而灵活改变,
其针对性有待改进;
• p4app 是一个可以构建、运行、调试和测试 P4 程序的工具,其工作过程具体包括:p4app 运行一个
以.p4app 为后缀的程序包,该程序包可以封装 P4 程序、JSON 格式文件等,还可以封装 P4 编译器、抓
包、发包等工具.在测试过程中,stf 测试框架直接编译 p4app 程序包将生成一个.stf 文件,发送.stf 文件
中的报文并验证 BMv2 交换机发出的报文与预期是否一致;
• ptf 是一个用 python 实现的数据平面测试框架,主要功能来自 OFTest 测试框架.ptf 专注于数据平面,并
且不依赖于 OpenFlow,且添加了 Filters、Ternary matching 和 Test timeout 等功能.
上述常见的测试工具已经部分应用于 P4 程序的功能测试.2019 年 11 月,ONF 先后发布了交换机操作系统
Stratum 和目前正在开发中的针对 Stratum 交换机测试的 Test Vector Framework,该框架正在致力于开发一系列
供应商无关的测试来检验目标交换机与 Stratum 的一致性.本文着重针对面向 P4 编程语言的一致性测试用例生
成方法进行相关研究.
2 一致性测试用例覆盖标准
软件测试的覆盖指标包括语句覆盖、判定覆盖、路径覆盖等,而面向 P4 程序的一致性测试指标定义尚未
明确.通过分析 P4 程序,我们发现首部(header)、解析器(parser)、动作(actions)、表(tables)、控制模块(control
blocks)这 5 个 P4 编程语言的基本组成部分的工作都是与匹配动作表(match-action tables)相关联,而 P4 网络设
备也是通过匹配流水线(pipeline)中的表来执行相应处理数据包的操作.因此,我们可以通过 P4 网络设备的控制
命令来进行面向 P4 编程语言的 SDN 数据平面软件一致性测试,则相应的测试用例为控制命令.
由于每条控制命令所含字段不同,每条字段的合法类型也不同,经过分析,本文将面向 P4 编程语言的 SDN
数据平面软件一致性测试用例覆盖标准确立为:生成足够的测试用例,使得所有针对 match-action tables 操作的
控制命令都被执行,其中每条命令的每个字段都要覆盖合法和不合法两种测试结果.
3 面向 P4 编程语言的一致性测试用例自动生成方法设计
本节设计了一致性测试用例自动化生成方法,详细介绍了 P4 程序经过编译、解析、测试用例生成的整个
自动化过程.
如图 2 所示,本节设计的测试用例自动生成方法基本流程为:P4 程序经过编译过程,生成解析过程所需要的
P4 信息文件(.p4info 文件)和 P4 数据平面描述文件;所述 P4 数据平面描述文件包括 JSON 格式的网络设备配置
文件;解析过程包括获取目标网络设备控制命令集,依据每条控制命令格式,从所述 P4 程序编译单元生成的 P4
信息文件中解析出 TABLE_NAME,ACTION_NAME,MATCH_KEY,PARAMETERS 字段信息,最终生成控制信
息实体集合;测试用例生成过程划分了测试用例类型,将所述解析过程生成的控制信息实体集按照测试用例类
型组织,最终生成面向 P4 编程语言 SDN 数据平面软件一致性测试用例集.
3.1 编译过程
p4c 编译器是为 P4 编译器设计的编译器基础设施,同时支持 P4 14 以及 P4 16 两个版本的 P4 语言.如图 3 所
示: p4c 提供了标准的前端和中间件,通过在编译时添加选项,可以和特定目标的后端相结合使用.p4c 编译器支
持 EBPF Backend,BMv2 Backend 和 P4test Backend.其中 EBPF 能够生成可以扩展 Berkeley 数据包过滤程序的
C 代码, BMv2 能够生成用于简单的网络交换仿真的 JSON 格式文件,P4test 是一个测试用的后端编译器.最新的