SDN 数据平面软件一致性测试用例生成方法∗
2020-11-03张雯雯许天予郑孝遥
张雯雯 , 许天予 , 章 玥 , 郑孝遥
1(上海市高可信计算重点实验室(华东师范大学),上海 200062)
2(华东师范大学 教育部软硬件协同设计技术与应用工程研究中心,上海 200062)
3(上海移动通信有限公司,上海 200070)
4(安徽师范大学 计算机与信息学院,安徽 芜湖 241002)
在网络需求不断增加、网络灵活性要求不断提高的背景下,SDN(software-defined network)解决了架构复杂且分散的传统网络出现的问题,使网络具有更强的灵活性.SDN 使网络控制平面和转发平面分离,使网络具有可编程性.斯坦福大学的Nick 教授及其团队研究出P4 高级编程语言,P4 是一种协议独立的针对数据转发平面编程的语言,旨在允许我们定义交换机将识别(或“解析”)的表头、如何匹配每个表头以及我们希望交换机在每个表头上执行的操作.P4 语言的特征在于,用户可以直接根据自己对处理数据包的需求定义P4 程序.
OpenFlow 协议是比较流行的SDN 南向协议,目前,针对OpenFlow 协议的一致性测试工作展开了很多,但是面向P4 编程语言的一致性测试研究甚少,缺乏成熟的一致性测试方案.P4 编程语言具有巨大的灵活性且传统的人工构造测试用例是一项繁琐耗时费力的工作,面向P4 编程语言研究SDN 数据平面软件一致性测试用例生成方法具有重要意义.
面向P4 编程语言的一致性测试,本质上是将测试用例发送给P4 网络设备,通过比较实际输出和预期输出的一致程度,保证了P4 网络设备在错综复杂的网络环境中的表现与预期表现一致性.面向P4 编程语言的SDN数据平面软件一致性测试,目的在于保障控制器与网络设备之间的互操作性.
装载了P4 程序的网络设备基本的工作机制为:接收数据包;解析器以有限状态机的形式解析数据包包头,从初始状态开始,每一种状态解析一种协议,从低层协议解析匹配首部定义的协议进而转移到高层协议字段,最终转移至目标状态;执行Match-Action 动作,数据包头的目的地址与表的匹配字段进行匹配,当数据包中的字段和匹配字段根据给定的匹配类型匹配成功时,就会执行对应的动作,如果匹配不成功,则会执行默认动作(default_action).
本文重点描述面向P4 编程语言的SDN 数据平面软件一致性测试用例生成方法进行综述.具体来说,通过研究SDN 架构、P4 程序的工作原理,我们发现表和动作是实现转发功能的核心部分:动作可以处理数据,定义转发等动作;而表是匹配动作表(match-action tables)的简称,表会定义匹配字段(key)、匹配方式以及匹配成功后执行的对应动作.本文生成测试用例的核心思想是:通过划分测试用例类型,获取P4 目标网络设备控制命令集,依据P4 程序表和动作具体信息构造测试用例.本文设计并实现了自动生成批量测试用例的工具,并以装载P4程序的simple_switch 虚拟交换机为测试对象说明测试用例的生成过程.
1 相关工作
本节介绍SDN 体系架构、SDN 领域的P4 编程语言介绍及相关研究和面向OpenFlow 协议以及面向P4编程语言的一致性测试的相关研究.
1.1 SDN体系架构
SDN 是由美国斯坦福大学Clean State 课题研究组提出的,是网络虚拟化的一种实现方式[1].2007 年,Casado博士基于SANE 实现了采用集中式控制器来管理网络的Ethane 项目[2].SANE/Ethane 项目正是SDN 和OpenFlow 的前身.SDN 的核心在于:利用分层的思想,实现数据平面与控制平面相分离.SDN 的优势在于增强了传统网络灵活性,解决了传统网络可控性差的问题.
如图1 所示,SDN 体系架构[3]分为3 层:最底层为架构层(也被称为数据层、转发层),主要功能是实现数据转发;中间层为控制层,实现SDN 的主要功能,集中存储网络设备的控制逻辑,其控制逻辑控制数据平面数据包转发;最上层为应用层,包含错综复杂的业务应用.控制层的控制逻辑通过SDN 北向接口(northbound interface,简称NBI)与应用层进行通信,使用户按实际需求定制开发.控制层和数据层通过SDN 南向接口(southbound interface,简称SBI)进行通信,控制数据层数据转发.
交换机等路由设备是数据层的基本网络元素,不同的转发规则形成元素之间不同的数据通路连接.P4 编程语言具有设备无关性,用户无需关心底层元素的实现细节,仅仅通过简明易懂的编程就可以实现快捷开发迅速部署.因而,程序员可以通过可编程的控制逻辑控制整个SDN 网络.具体来说,控制逻辑通过转换应用程序对数据层元素进行低级控制,同时提供相关信息,还可以根据策略协调对于有限网络资源的需求,从而真正实现了软件定义网络.
1.2 P4编程语言介绍
随着SDN 的发展,OpenFlow 协议作为SDN 的南向协议,一时间成为流行的标准用于控制平面和数据平面的交互.OpenFlow 假设交换机具有固定的、众所周知的行为,通常在交换机ASIC 的数据表中描述.传统的高性能交换芯片支持一组固定的协议,因为它们直接在芯片中实现IEEE 和IETF 标准协议.用户无法更改其行为并添加新协议或测量和控制数据路径的新方法.
然而OpenFlow 并不真正控制交换机行为,它为我们提供了一种填充一组众所周知的表的方法.SDN 通常与OpenFlow 协议相关联,OpenFlow 协议是SDN 的南向接口,目前已经发布了许多版本,其匹配域个数也不断增加,但是每次更新匹配域,对应交换机的协议栈和数据包处理逻辑就要更新,降低了OpenFlow 协议的可扩展性、可编程性,因此对其协议的推广造成负面影响.
针对此问题,斯坦福大学的Nick 教授及其团队研究出P4 高级编程语言.2015 年6 月在斯坦福大学[4]展开对P4 的相关工作.P4 是一种协议独立的语言,提供了编码结构,其范围从通用CPU 到网络处理器、FPGA 和定制ASIC.P4 编程语言的特征在于用户可以直接根据自己对处理数据包的需求定义P4 程序,然后经过编译过程生成适配文件将用户需求配置到网络设备.
P4 编程语言如今分为P414和P416两个版本,最新的版本P416相比P414在语法和语义方面的进行了许多修改.P4 程序有5 个基本组成部分,分别是首部(header)、解析器(parser)、动作(actions)、表(tables)、控制模块(control blocks)[5].首部类型是由成员字段组成的有序列表,每一个成员字段都有其名称和字段长度,用户可以根据需要定义协议字段;解析器的工作是把数据包中的头和元数据解析出来,解析器是以有限状态机的形式实现;表和动作是实现数据包处理的核心部分,动作可以处理数据,定义转发等操作;表是匹配动作表(match-action tables)的简称,表会定义匹配字段(key)、匹配方式以及匹配成功后执行的动作;控制平面制定控制流,将管理数据包处理的规则插入到流水线中,当规则与数据包匹配时,将使用控制平面提供的参数作为规则的一部分来调用其操作.
P4 的3 个主要目标是协议无关性、可重新配置性以及可移植性:协议无关性是指协议和设备无关性,设备不会指定协议;可重新配置性指协议重构性,程序员能够在部署后继续根据需求修改设备的行为;可移植性指P4 程序不与特定的网络设备相关联.通过P4 程序,我们可以定义交换机将识别(或“解析”)的表头、如何匹配每个表头以及我们希望交换机在每个表头上执行的操作.因此,通过P4 语言,用户可以对网络设备的硅处理芯片(如交换机、路由器、网络接口等)进行管理.由于传统交换机只有一种转发数据包的方式,功能固定,所以传统网络功能呈“自下而上”构建;P4 可编程网络则呈现“自上而下”的网络功能.
现在,P4 语言已经成为 Linux 基金会投资组织的一部分,并作为开放网络基金会(open networking foundation,简称ONF)[6]旗下的项目之一.P4 开发环境也在逐渐发展壮大起来,目前,P4 社区不仅拥有强大的编译器,还拥有了架构独立的P4 交换机,其主要可编程目标包括可编程NIC、高端交换芯片、软件交换机(如OVS和eBPF)等.P4 成为开发新型数据平面设计的一种越来越受欢迎的选择,目前,阿里巴巴、AT&T、思科、Juniper、Netronome、Vmare、Xilinx 和中兴通讯等大厂也加入了P4 联盟,其应用包括NetFlow,Paxos 等方面的研究,且范围范围还在扩展,但有关P4 程序的测试工作有待开展.
在Sigcomm 2017 年会上,来自清华大学的余舟等人进行了P4 模块化编程[7]以及P4 驱动的网络模拟器[8]的演示,其P4 模块化编程体系结构ClickP4 简化了P4 程序的开发过程,ClickP4 的网络策略具有可靠性.P4 首次应用于模拟网络的研究成果是网络模拟器NS4,NS4 简化了模拟器内部模型开发过程,构建了虚拟的P4 网络设备及环境系统,是一款拓展性强的P4 行为模型验证工具.2019 年11 月,ONF 开源了包括NG-SDN 接口和模型的交换机操作系统 Stratum[9],以提供全生命周期的控制、配置和接口操作管理.Stratum 对外呈现 P4、P4Runtime、gNMI/OpenConfig 和gNOI 等接口,基于上述接口的Stratum 一致性测试框架正在研究制定中.
P4 和OpenFlow 协议的主要区别在于:OpenFlow 协议功能固定、协议更新时间长,而P4 编程语言可以告诉交换机如何识别、处理数据包,让网络架构师或程序员可以控制交换机、指定转发行为,让填充定义表成为可能.某种意义上来说,P4 编程语言可以真正意义上的完全实现软件定义网络.
1.3 一致性测试相关研究
全球已经存在许多独立的针对OpenFlow 协议一致性测试的实验室,如北京互联网研究院(BII)、韩国电子通信研究院(ETRI),这些实验室已经提出OpenFlow 协议一致性测试测试方案并获得了SDN 标准化组织ONF的认可.2013 年,ONF 宣布启动OpenFlow 一致性测试项目,目的在于认证网络供应商在交换机、路由器和网络软件中SDN 协议的实施.ONF 提供了完全一致性、三层一致性以及二层一致性这3 种针对OpenFlow 的一致性测试规范,网络供应商可以根据实际要求选择测试规范对数据转发设备进行测试.目前,ONF 已经认证并投入使用的工具包括OFCheck,OFsuite,OFTest 等.
P4 编程语言的可编程性和灵活性是提高网络性能的关键,符合错综复杂的网络需求对未来网络发展方向的要求.通信协议按照标准落地,是协议设计的初衷和目的,是保证设备之间按照协议设定进行通信的关键.检测评估协议是否落地,一致性测试必不可少.针对P4 编程语言的测试工具有p4pktgen,p4app 以及ptf 数据平面测试框架.
· p4pktgen[10]是一个可以为P4 程序自动化生成测试用例的开源工具.p4pktgen 不直接依赖P4 程序,而是解析P4 程序经编译后的JSON 格式文件,并为给定程序中的路径生成数据包和表配置,用户可以选择生成所有路径的测试用例,也可以生成优先考虑分支覆盖范围的测试用例.随后,p4pktgen 配置BMv2 交换机、发送测试包并验证数据包的转发是否和预期的路径一致.p4pktgen 支持P414和P416两个版本的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 编译器设计的编译器基础设施,同时支持P414以及P416两个版本的P4 语言.如图3 所示:p4c 提供了标准的前端和中间件,通过在编译时添加选项,可以和特定目标的后端相结合使用.p4c 编译器支持EBPF Backend,BMv2 Backend 和P4test Backend.其中EBPF 能够生成可以扩展Berkeley 数据包过滤程序的C 代码,BMv2 能够生成用于简单的网络交换仿真的JSON 格式文件,P4test 是一个测试用的后端编译器.最新的后端编译器详情请见https://p4.org/.
图3 所示为P4 程序的编译过程,本文使用的是p4c-bm2-ss 来编译P4 程序,p4c-bm2-ss 是p4c 项目编译完后的产物之一,具体编译过程为:p4c 编译器首先将P414和P416编写的P4 源程序转换成通用的中间表示IR,然后经过前端编译器,生成为通用的后端中间表示IR 和P4 信息文件(.p4info 文件),中间表示IR 经过p4c-bm2-ss编译生成一个JSON 格式的数据文件,此文件专门用于将P4 程序编译生成BMv2 使用的数据平面描述文件.我们研究发现:由于P4 官方提供了一个Helper 类以帮助解析.p4info 文件,该文件格式更加便于处理,因此,.p4info文件可用于P4 表信息的解析过程.
3.2 解析过程
由于面向P4 编程语言的SDN 的实现,是通过定义匹配动作表(match-action tables)来部署P4 网络设备.匹配动作表(match-action tables)是面向P4 编程语言的SDN 实现的关键载体,也是体现P4 编程语言特性的重要部分.用户可以直接把自己对处理数据包的需求编写成P4 程序来部署网络设备,因而网络架构师等人员可以通过控制网络设备、指定转发行为、填充定义表来实现SDN.而确定装载P4 程序的网络设备是否真正实现用户需求,则需要对目标网络设备进行一致性测试.一致性测试用例的生成,需要通过解析P4 目标设备的控制命令集来获取每条命令所需要的表名、匹配字段、动作、动作参数信息.
· 控制命令信息类结构设计
我们以面向对象的思想来建模控制命令信息Command 类,该类成员包括CommandName,CommandFormat,TableName,ActionName,MatchField,ActionParameter1,ActionParameter2,如图4 所示.
· 解析控制命令集
我们研究发现,不同的P4 网络设备具有不同的控制命令集.生成用于P4 网络设备的测试用例首先需要解析P4 网络设备的控制命令集,进而生成包含控制命令头、控制命令格式以及控制命令字段的控制命令信息实体.本节设计了用以解析控制命令集的方法,生成控制命令信息实体列表,其工作流程如图5 所示.
· 解析P4 信息文件
.p4info 文件记录了P4 程序匹配动作表(match-action tables).P4 官方提供了一个Helper 类,以帮助解析.p4info 文件,实现了根据id 查找表名、动作名,根据表名、动作名查询对应的id、匹配字段、动作参数的功能.因此考虑从.p4info 文件中解析命令所需要的字段,其工作流程如图6 所示.
其中,解析.p4info 文件具体过程为:解析命令信息实体命令名称,解析该命令信息实体所需字段信息,利用Helper 类所提供的方法对.p4info 文件中所有匹配动作表(match-action tables)进行线性查找,将控制命令格式和每个匹配动作表(match-action tables)对应的TABLE_NAME,ACTION_NAME,MATCH_KEY,PARAMETERS 字段信息写入命令信息实体.
(1) 解析表名
表名层级关系为table→preamble→name.解析表名的流程如图7 所示,每获取一个表名,会判断当前表是否为最后一张表:若有,则继续获取;若没有,则结束.随后,所有的表名都会从文件中被提取出来.
(2) 解析匹配字段
匹配字段的层级关系为table→match_fields→(id,name,bitwidth).解析匹配字段的流程如图8 所示,匹配字段和表名一一对应,输入表名后判断该表是否存在:若存在,则能成功获取匹配字段;否则报错.在操作正确的情况下,表的对应匹配字段会从文件中被提取出来.
(3) 解析动作
动作名的层级关系为actions→preamble→name.解析动作的流程如图9 所示,根据表名获取该表的所有动作ID 后,根据ID 获取动作名,判断该ID 是否为最后一个ID:若不是,则继续获取ID.表对应的所有动作名都会被从文件解析出来.
(4) 解析动作参数
动作参数的层级关系为actions→params→(id,name,bitwidth),解析动作参数的流程如图10 所示,根据动作名判断该动作是否有参数:若有,则获取所有参数的信息;若没有,则结束.
每解析得到一个命令信息实体,命令信息实体即被插入命令信息实体列表.经过以上解析过程,最终生成测试用例所需的命令信息实体集合.
3.3 测试用例生成过程
前两节生成的命令信息实体集合为面向P4 编程语言的SDN 数据平面软件一致性测试用例的生成提供了数据基础,然而测试用例实体的生成需要一定的组织规范.本节不仅划分了测试用例类型,还分别设计了针对每种测试用例类型的测试用例构造方法.测试用例生成方法可分为生成单条测试用例和批量生成全部测试用例.
· 测试用例类型
本节依据测试用例结果类型,将最终生成的测试用例实体分为5 种类型:命令合法、表名不合法、动作不合法、匹配域不合法、参数不合法.
· 构造测试用例
单条测试用例生成过程为:用户依次选择测试用例类型、控制命令类型,再根据命令类型所需字段选择或编辑表名、动作名、匹配域、参数信息,最后生成单条测试用例.
批量生成全部测试用例集的过程为:以测试用例类型为组织单位构造测试用例,遍历解析过程生成的命令信息实体列表.若测试用例类型为命令合法,则直接依据每个命令信息实体的命令格式和字段信息构造测试用例;若测试用例类型为表名不合法,则将命令信息实体中的TABLE_NAME 字段修改为错误的TABLE_NAME字段,再依据命令格式与其他字段信息构造测试用例;同理,动作不合法、匹配域不合法、参数不合法类型的测试用例构造方法与命令不合法类似.
4 测试用例生成示例
本节以装载P4 程序的simple_switch 虚拟交换机为测试对象,说明一致性测试用例生成过程.
4.1 解析控制命令集
simple_switch 虚拟交换机的控制命令集如图11 所示.
由于控制命令集包含许多功能类似的表项操作命令,并且不同的P4 网络设备控制命令集并不完全相同,因此,本实验并没有对全部控制命令生成一致性测试用例,而是选取simple_switch 虚拟机中具有代表性的表操作控制命令table_add,table_delete,table_dump,table_modify 来生成一致性测试用例.
4.2 控制命令类型及格式
· table_add 表项增加命令
合法的增加表项的命令格式如下:
插入一个表项需要确定表名、动作名、匹配域、动作参数.以命令“table_add ipv4_lpm drop 0/32 0/32⇒0”为测试用例进行说明.其中,ipv4_lpm 指定了该命令是向ipv4_lpm 这张表插入表项,ipv4_forward 指定了表项匹配成功时执行的动作为ipv4_forward,0xffffffff/32 指定了匹配字段是16 进制的ffffffff,⇒是命令的格式需要所定义的箭头形状,⇒后的0x0 0x0 指定了ipv4_forward 动作的两个参数均为0,命令中的动作需要几个参数,⇒符号后就应当给出几个参数.命令中/后的数字如0/32 表示的是该数长度为32 位.
· table_delete 表项删除命令
合法的删除表项的命令格式如下:
删除一个表项需要确定表项所在表的表名以及该表项在表中的编号,在这里被称为entry handle.以命令“table_delete ipv4_lpm 0”为测试用例进行说明.其中,ipv4_lpm 指定了该命令删除的表项在表ipv4_lpm 中,0 说明了该命令会删除表中编号为0 的表项.
· table_dump 表项查询命令
合法的查询表项的命令格式如下:
查询表项需要确定需要查询的表项所在表的表名.以命令“table_dump ipv4_lpm”为测试用例进行说明.其中,ipv4_lpm 指定了该命令查询的是名为ipv4_lpm 这张表中的所有表项.
· table_modify 表项修改命令
合法的修改表项的命令格式如下:
修改表项需要确定表项所在表的表名、表项中的动作名、表项的编号、动作的参数.以命令“table_modify ipv4_lpm ipv4_forward 0 0x123456654321 1”为测试用例进行说明.其中,ipv4_lpm 指定了该命令修改的是表ipv4_lpm 中的表项,ipv4_forward 说明了该命令修改的表项中的动作为ipv4_forward,0 指定了该命令修改的是表 ipv4_lpm 中编号为 0 的表项,0x123456654321 1 指定了该命令是将 ipv4_forward 的两个参数改成0x123456654321 1.命令要修改的表项中的动作有几个参数,就要给出几个参数.
4.3 生成测试用例集
如图12 所示为测试用例生成的算法映射图,以测试用例类型命令合法、表名不合法、动作不合法、匹配域不合法、参数不合法为组织单位,以一个个命令信息实体为信息体,构造对应类型的 TABLE_NAME,ACTION_NAME,MATCH_KEY,PARAMETERS 字段,生成table_add,table_delete,table_dump,table_modify 命令.
如图13 所示,本节以增删改查命令类型的测试用例生成过程为例进行说明.在完成了对P4 信息文件(.p4info 文件)的解析后,以测试用例类型为组织单位,构造符合测试用例类型的字段,依据命令信息实体的命令格式,生成测试用例.表项的增加和修改动作需要用到表名、匹配字段、动作名和动作参数,而表项的查询和删除命令需要用到表名.本节实现的SDN 数据平面软件一致性测试用例生成工具不直接依赖于P4 程序,而是直接依赖于编译后的P4 信息文件(.p4info 文件).
· 参数默认值的设定原则
命令中,用户需要自行填写的参数有匹配字段(match_field)和动作参数(action_params),这两个参数不能由.p4info 确定,需要用户根据从.p4info 文件中提取出参数的位数自行填入.程序可以识别十进制数并转换成十六进制,但是交换机中记录的是十六进制的格式,目前的IP 地址格式是32 位二进制数.为了方便也分成了4 段,每段8 位.考虑到以十进制数表示IP 地址不直观也非当今主流,所以需要根据参数的位数给出一个默认的参数,以确定一个参数的格式.匹配字段中的参数往往是目的地址或者是源地址之类的IP 地址.匹配字段的长度必须是8bits 的整数倍.参考参数见表1.
Table 1 Reference parameters表1 参考参数
· 单个测试用例示例
本节设计了测试用例实体结构,每个测试用例实体分为4 部分:命令格式CF(CommandFormat)、前提条件PC(Precondition)、测试用例TC(TestCase)、期望输出结果EO(ExpectedOutput).设计该结构的目的在于规范测试用例实体,使测试用例实体信息更加清晰明了,方便面向P4 编程语言的SDN 数据平面软件一致性测试实际结果与预期结果比对过程.前提条件PC 和期望输出结果EO 为测试系统初期部署过程所作工作,本文不作赘述.
图14 所示为一个测试用例实例,其中,
· 命令格式CF 为“table_add ipv4_lpm myTunnel_ingress 0xffffffff/32⇒0x0 0x0”;
· 前提条件PC 为“The entity to be added should not be duplicate”;
· 测试用例TC 为“table_add ipv4_lpm myTunnel_ingress 0xffffffff/32⇒0x0 0x0”;
· 期望输出结果EO 为“Entry has been added with handleN”.
TC 中,table_add 和ipv4_lpm 代表向ipv4_lmp 表插入表项,0xffffffff/32 代表匹配字段是32 位的0xffffffff,匹配成功则向表中插入参数为0x0 和0x0 的动作myTunnel_ingress.
· 测试用例集示例(如图15 所示)
4.4 测试用例自动生成工具测试
本节对我们已经实现的SDN 数据平面软件一致性测试用例自动生成工具进行一致性测试用例生成测试实验,该实验选取了3 个P4 程序作为测试工具的输入,通过分析生成测试用例覆盖程度验证其有效性.
· demo1 含有1 张表,名为ipv4_lpm,表中有3 个动作:ipv4_forward,drop,NoAction,因此,预期生成3 条表项的插入命令、1 条表项的查询命令、1 条表项的删除命令、3 条表项的修改命令;
· demo2 含有 3 张表,分别是 ipv4_da_lpm,mac_da,send_frame.其中,表 ipv4_da_lpm 中有 2 个动作:set_l2ptr,my_drop,表mac_da 中有2 个动作:set_bd_dmac,my_drop,表send_frame 中有2 个动作:rewrite_mac,mydrop.预期生成6 条表项的插入命令、3 条表项的查询命令、3 条表项的删除命令、6 条表项的修改命令;
· demo3 含有2 张表,分别是ipv4_lpm,myTunnel_exact.其中,ipv4_lpm 表中有4 个动作:ipv4_forward,myTunnel_ingress,drop,NoAction,表 myTunnel_exact 中有 3 个动作:myTunnel_forward,myTunnel_egress,drop.预期生成7 条表项的插入命令、2 条表项的查询命令、2 条表项的删除命令、7 条表项的修改命令.
如表2 所示,3 个P4 程序共12 条被测控制命令通过一致性测试用例自动生成工具进行一致性测试用例生成测试.我们发现:生成测试用例的实际结果与预期结果完全一致,每条被测命令生成的测试用例集都覆盖了该控制命令字段所有可能出现的情况,实现了全覆盖.则以上实验验证了面向P4 编程语言的SDN 数据平面软件一致性测试用例自动生成工具具有有效性.
Table 2 Test case automatic generation tool test data table表2 测试用例自动生成工具测试数据表
4.5 测试工具界面
测试用例生成工具的界面如图18 所示,在用户选定.p4info 文件的后,点击Write In 按钮,则生成.p4info 文件对应的全部测试用例.在选定.p4info 文件后,依次选择table、actions 下拉框,随后读取match_field 和action_params,点击Generate entry 按钮,即在下方空白处显示表项的信息.
5 总结
面向P4 编程语言的一致性测试本质上是在将测试用例发送给P4 网络设备,通过比较实际输出和预期输出的一致程度,保证了P4 网络设备在错综复杂的网络环境中的表现与预期表现一致性.测试用例是执行一致性测试的载体,传统的人工构造测试用例是一项繁琐耗时费力的工作.本文介绍了SDN 架构、P4 编程语言特性,调研了SDN 领域一致性测试现有工作情况,设计了用于面向P4 编程语言的SDN 数据平面软件一致性测试用例生成方法,实现了面向P4 编程语言的SDN 数据平面软件一致性测试用例自动生成工具.实验结果表明:该测试工具能够由用户自己选择或编辑生成单条测试用例,也可以按照预期生成任意P4 程序的测试用例集.
除此之外,在实际应用中,本文工作还有进一步提升空间.
本文是面向P4 编程语言的SDN 数据平面软件一致性测试用例生成研究工作,在本文工作的基础上,可以针对P4 编程语言的SDN 数据平面软件进行真实网络环境下的一致性测试工作研究;
面向P4 编程语言的SDN 数据平面软件一致性测试过程需要包括测试环境搭建、测试系统初期部署、一致性测试用例生成、一致性测试等阶段.后续工作可以设计面向P4 编程语言的SDN 数据平面软件一致性测试一体化过程,可以基于gRPC 框架对真实网络环境下的测试用例的发送、测试服务调用和测试结果接收过程进行研究.
交换机操作系统Stratum 支持P4 API、P4Runtime API,可以基于本文提出的面向P4 编程语言的SDN 数据平面软件一致性测试用例生成方法进行Stratum 交换机一致性测试的研究.