張雯雯 , 許天予 , 章 玥 , 鄭孝遙
1(上海市高可信計算重點實驗室(華東師范大學),上海 200062)
2(華東師范大學 教育部軟硬件協(xié)同設計技術與應用工程研究中心,上海 200062)
3(上海移動通信有限公司,上海 200070)
4(安徽師范大學 計算機與信息學院,安徽 蕪湖 241002)
在網(wǎng)絡需求不斷增加、網(wǎng)絡靈活性要求不斷提高的背景下,SDN(software-defined network)解決了架構復雜且分散的傳統(tǒng)網(wǎng)絡出現(xiàn)的問題,使網(wǎng)絡具有更強的靈活性.SDN 使網(wǎng)絡控制平面和轉(zhuǎn)發(fā)平面分離,使網(wǎng)絡具有可編程性.斯坦福大學的Nick 教授及其團隊研究出P4 高級編程語言,P4 是一種協(xié)議獨立的針對數(shù)據(jù)轉(zhuǎn)發(fā)平面編程的語言,旨在允許我們定義交換機將識別(或“解析”)的表頭、如何匹配每個表頭以及我們希望交換機在每個表頭上執(zhí)行的操作.P4 語言的特征在于,用戶可以直接根據(jù)自己對處理數(shù)據(jù)包的需求定義P4 程序.
OpenFlow 協(xié)議是比較流行的SDN 南向協(xié)議,目前,針對OpenFlow 協(xié)議的一致性測試工作展開了很多,但是面向P4 編程語言的一致性測試研究甚少,缺乏成熟的一致性測試方案.P4 編程語言具有巨大的靈活性且傳統(tǒng)的人工構造測試用例是一項繁瑣耗時費力的工作,面向P4 編程語言研究SDN 數(shù)據(jù)平面軟件一致性測試用例生成方法具有重要意義.
面向P4 編程語言的一致性測試,本質(zhì)上是將測試用例發(fā)送給P4 網(wǎng)絡設備,通過比較實際輸出和預期輸出的一致程度,保證了P4 網(wǎng)絡設備在錯綜復雜的網(wǎng)絡環(huán)境中的表現(xiàn)與預期表現(xiàn)一致性.面向P4 編程語言的SDN數(shù)據(jù)平面軟件一致性測試,目的在于保障控制器與網(wǎng)絡設備之間的互操作性.
裝載了P4 程序的網(wǎng)絡設備基本的工作機制為:接收數(shù)據(jù)包;解析器以有限狀態(tài)機的形式解析數(shù)據(jù)包包頭,從初始狀態(tài)開始,每一種狀態(tài)解析一種協(xié)議,從低層協(xié)議解析匹配首部定義的協(xié)議進而轉(zhuǎn)移到高層協(xié)議字段,最終轉(zhuǎn)移至目標狀態(tài);執(zhí)行Match-Action 動作,數(shù)據(jù)包頭的目的地址與表的匹配字段進行匹配,當數(shù)據(jù)包中的字段和匹配字段根據(jù)給定的匹配類型匹配成功時,就會執(zhí)行對應的動作,如果匹配不成功,則會執(zhí)行默認動作(default_action).
本文重點描述面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試用例生成方法進行綜述.具體來說,通過研究SDN 架構、P4 程序的工作原理,我們發(fā)現(xiàn)表和動作是實現(xiàn)轉(zhuǎn)發(fā)功能的核心部分:動作可以處理數(shù)據(jù),定義轉(zhuǎn)發(fā)等動作;而表是匹配動作表(match-action tables)的簡稱,表會定義匹配字段(key)、匹配方式以及匹配成功后執(zhí)行的對應動作.本文生成測試用例的核心思想是:通過劃分測試用例類型,獲取P4 目標網(wǎng)絡設備控制命令集,依據(jù)P4 程序表和動作具體信息構造測試用例.本文設計并實現(xiàn)了自動生成批量測試用例的工具,并以裝載P4程序的simple_switch 虛擬交換機為測試對象說明測試用例的生成過程.
本節(jié)介紹SDN 體系架構、SDN 領域的P4 編程語言介紹及相關研究和面向OpenFlow 協(xié)議以及面向P4編程語言的一致性測試的相關研究.
SDN 是由美國斯坦福大學Clean State 課題研究組提出的,是網(wǎng)絡虛擬化的一種實現(xiàn)方式[1].2007 年,Casado博士基于SANE 實現(xiàn)了采用集中式控制器來管理網(wǎng)絡的Ethane 項目[2].SANE/Ethane 項目正是SDN 和OpenFlow 的前身.SDN 的核心在于:利用分層的思想,實現(xiàn)數(shù)據(jù)平面與控制平面相分離.SDN 的優(yōu)勢在于增強了傳統(tǒng)網(wǎng)絡靈活性,解決了傳統(tǒng)網(wǎng)絡可控性差的問題.
如圖1 所示,SDN 體系架構[3]分為3 層:最底層為架構層(也被稱為數(shù)據(jù)層、轉(zhuǎn)發(fā)層),主要功能是實現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā);中間層為控制層,實現(xiàn)SDN 的主要功能,集中存儲網(wǎng)絡設備的控制邏輯,其控制邏輯控制數(shù)據(jù)平面數(shù)據(jù)包轉(zhuǎn)發(fā);最上層為應用層,包含錯綜復雜的業(yè)務應用.控制層的控制邏輯通過SDN 北向接口(northbound interface,簡稱NBI)與應用層進行通信,使用戶按實際需求定制開發(fā).控制層和數(shù)據(jù)層通過SDN 南向接口(southbound interface,簡稱SBI)進行通信,控制數(shù)據(jù)層數(shù)據(jù)轉(zhuǎn)發(fā).
交換機等路由設備是數(shù)據(jù)層的基本網(wǎng)絡元素,不同的轉(zhuǎn)發(fā)規(guī)則形成元素之間不同的數(shù)據(jù)通路連接.P4 編程語言具有設備無關性,用戶無需關心底層元素的實現(xiàn)細節(jié),僅僅通過簡明易懂的編程就可以實現(xiàn)快捷開發(fā)迅速部署.因而,程序員可以通過可編程的控制邏輯控制整個SDN 網(wǎng)絡.具體來說,控制邏輯通過轉(zhuǎn)換應用程序?qū)?shù)據(jù)層元素進行低級控制,同時提供相關信息,還可以根據(jù)策略協(xié)調(diào)對于有限網(wǎng)絡資源的需求,從而真正實現(xiàn)了軟件定義網(wǎng)絡.
隨著SDN 的發(fā)展,OpenFlow 協(xié)議作為SDN 的南向協(xié)議,一時間成為流行的標準用于控制平面和數(shù)據(jù)平面的交互.OpenFlow 假設交換機具有固定的、眾所周知的行為,通常在交換機ASIC 的數(shù)據(jù)表中描述.傳統(tǒng)的高性能交換芯片支持一組固定的協(xié)議,因為它們直接在芯片中實現(xiàn)IEEE 和IETF 標準協(xié)議.用戶無法更改其行為并添加新協(xié)議或測量和控制數(shù)據(jù)路徑的新方法.
然而OpenFlow 并不真正控制交換機行為,它為我們提供了一種填充一組眾所周知的表的方法.SDN 通常與OpenFlow 協(xié)議相關聯(lián),OpenFlow 協(xié)議是SDN 的南向接口,目前已經(jīng)發(fā)布了許多版本,其匹配域個數(shù)也不斷增加,但是每次更新匹配域,對應交換機的協(xié)議棧和數(shù)據(jù)包處理邏輯就要更新,降低了OpenFlow 協(xié)議的可擴展性、可編程性,因此對其協(xié)議的推廣造成負面影響.
針對此問題,斯坦福大學的Nick 教授及其團隊研究出P4 高級編程語言.2015 年6 月在斯坦福大學[4]展開對P4 的相關工作.P4 是一種協(xié)議獨立的語言,提供了編碼結構,其范圍從通用CPU 到網(wǎng)絡處理器、FPGA 和定制ASIC.P4 編程語言的特征在于用戶可以直接根據(jù)自己對處理數(shù)據(jù)包的需求定義P4 程序,然后經(jīng)過編譯過程生成適配文件將用戶需求配置到網(wǎng)絡設備.
P4 編程語言如今分為P414和P416兩個版本,最新的版本P416相比P414在語法和語義方面的進行了許多修改.P4 程序有5 個基本組成部分,分別是首部(header)、解析器(parser)、動作(actions)、表(tables)、控制模塊(control blocks)[5].首部類型是由成員字段組成的有序列表,每一個成員字段都有其名稱和字段長度,用戶可以根據(jù)需要定義協(xié)議字段;解析器的工作是把數(shù)據(jù)包中的頭和元數(shù)據(jù)解析出來,解析器是以有限狀態(tài)機的形式實現(xiàn);表和動作是實現(xiàn)數(shù)據(jù)包處理的核心部分,動作可以處理數(shù)據(jù),定義轉(zhuǎn)發(fā)等操作;表是匹配動作表(match-action tables)的簡稱,表會定義匹配字段(key)、匹配方式以及匹配成功后執(zhí)行的動作;控制平面制定控制流,將管理數(shù)據(jù)包處理的規(guī)則插入到流水線中,當規(guī)則與數(shù)據(jù)包匹配時,將使用控制平面提供的參數(shù)作為規(guī)則的一部分來調(diào)用其操作.
P4 的3 個主要目標是協(xié)議無關性、可重新配置性以及可移植性:協(xié)議無關性是指協(xié)議和設備無關性,設備不會指定協(xié)議;可重新配置性指協(xié)議重構性,程序員能夠在部署后繼續(xù)根據(jù)需求修改設備的行為;可移植性指P4 程序不與特定的網(wǎng)絡設備相關聯(lián).通過P4 程序,我們可以定義交換機將識別(或“解析”)的表頭、如何匹配每個表頭以及我們希望交換機在每個表頭上執(zhí)行的操作.因此,通過P4 語言,用戶可以對網(wǎng)絡設備的硅處理芯片(如交換機、路由器、網(wǎng)絡接口等)進行管理.由于傳統(tǒng)交換機只有一種轉(zhuǎn)發(fā)數(shù)據(jù)包的方式,功能固定,所以傳統(tǒng)網(wǎng)絡功能呈“自下而上”構建;P4 可編程網(wǎng)絡則呈現(xiàn)“自上而下”的網(wǎng)絡功能.
現(xiàn)在,P4 語言已經(jīng)成為 Linux 基金會投資組織的一部分,并作為開放網(wǎng)絡基金會(open networking foundation,簡稱ONF)[6]旗下的項目之一.P4 開發(fā)環(huán)境也在逐漸發(fā)展壯大起來,目前,P4 社區(qū)不僅擁有強大的編譯器,還擁有了架構獨立的P4 交換機,其主要可編程目標包括可編程NIC、高端交換芯片、軟件交換機(如OVS和eBPF)等.P4 成為開發(fā)新型數(shù)據(jù)平面設計的一種越來越受歡迎的選擇,目前,阿里巴巴、AT&T、思科、Juniper、Netronome、Vmare、Xilinx 和中興通訊等大廠也加入了P4 聯(lián)盟,其應用包括NetFlow,Paxos 等方面的研究,且范圍范圍還在擴展,但有關P4 程序的測試工作有待開展.
在Sigcomm 2017 年會上,來自清華大學的余舟等人進行了P4 模塊化編程[7]以及P4 驅(qū)動的網(wǎng)絡模擬器[8]的演示,其P4 模塊化編程體系結構ClickP4 簡化了P4 程序的開發(fā)過程,ClickP4 的網(wǎng)絡策略具有可靠性.P4 首次應用于模擬網(wǎng)絡的研究成果是網(wǎng)絡模擬器NS4,NS4 簡化了模擬器內(nèi)部模型開發(fā)過程,構建了虛擬的P4 網(wǎng)絡設備及環(huán)境系統(tǒng),是一款拓展性強的P4 行為模型驗證工具.2019 年11 月,ONF 開源了包括NG-SDN 接口和模型的交換機操作系統(tǒng) Stratum[9],以提供全生命周期的控制、配置和接口操作管理.Stratum 對外呈現(xiàn) P4、P4Runtime、gNMI/OpenConfig 和gNOI 等接口,基于上述接口的Stratum 一致性測試框架正在研究制定中.
P4 和OpenFlow 協(xié)議的主要區(qū)別在于:OpenFlow 協(xié)議功能固定、協(xié)議更新時間長,而P4 編程語言可以告訴交換機如何識別、處理數(shù)據(jù)包,讓網(wǎng)絡架構師或程序員可以控制交換機、指定轉(zhuǎn)發(fā)行為,讓填充定義表成為可能.某種意義上來說,P4 編程語言可以真正意義上的完全實現(xiàn)軟件定義網(wǎng)絡.
全球已經(jīng)存在許多獨立的針對OpenFlow 協(xié)議一致性測試的實驗室,如北京互聯(lián)網(wǎng)研究院(BII)、韓國電子通信研究院(ETRI),這些實驗室已經(jīng)提出OpenFlow 協(xié)議一致性測試測試方案并獲得了SDN 標準化組織ONF的認可.2013 年,ONF 宣布啟動OpenFlow 一致性測試項目,目的在于認證網(wǎng)絡供應商在交換機、路由器和網(wǎng)絡軟件中SDN 協(xié)議的實施.ONF 提供了完全一致性、三層一致性以及二層一致性這3 種針對OpenFlow 的一致性測試規(guī)范,網(wǎng)絡供應商可以根據(jù)實際要求選擇測試規(guī)范對數(shù)據(jù)轉(zhuǎn)發(fā)設備進行測試.目前,ONF 已經(jīng)認證并投入使用的工具包括OFCheck,OFsuite,OFTest 等.
P4 編程語言的可編程性和靈活性是提高網(wǎng)絡性能的關鍵,符合錯綜復雜的網(wǎng)絡需求對未來網(wǎng)絡發(fā)展方向的要求.通信協(xié)議按照標準落地,是協(xié)議設計的初衷和目的,是保證設備之間按照協(xié)議設定進行通信的關鍵.檢測評估協(xié)議是否落地,一致性測試必不可少.針對P4 編程語言的測試工具有p4pktgen,p4app 以及ptf 數(shù)據(jù)平面測試框架.
· p4pktgen[10]是一個可以為P4 程序自動化生成測試用例的開源工具.p4pktgen 不直接依賴P4 程序,而是解析P4 程序經(jīng)編譯后的JSON 格式文件,并為給定程序中的路徑生成數(shù)據(jù)包和表配置,用戶可以選擇生成所有路徑的測試用例,也可以生成優(yōu)先考慮分支覆蓋范圍的測試用例.隨后,p4pktgen 配置BMv2 交換機、發(fā)送測試包并驗證數(shù)據(jù)包的轉(zhuǎn)發(fā)是否和預期的路徑一致.p4pktgen 支持P414和P416兩個版本的P4 程序,其功能上尚且有一些沒有修復的bug,生成的數(shù)據(jù)包不能隨P4 程序更新而靈活改變,其針對性有待改進;
· p4app 是一個可以構建、運行、調(diào)試和測試P4 程序的工具,其工作過程具體包括:p4app 運行一個以.p4app 為后綴的程序包,該程序包可以封裝P4 程序、JSON 格式文件等,還可以封裝P4 編譯器、抓包、發(fā)包等工具.在測試過程中,stf 測試框架直接編譯p4app 程序包將生成一個.stf 文件,發(fā)送.stf 文件中的報文并驗證BMv2 交換機發(fā)出的報文與預期是否一致;
· ptf 是一個用python 實現(xiàn)的數(shù)據(jù)平面測試框架,主要功能來自OFTest 測試框架.ptf 專注于數(shù)據(jù)平面,并且不依賴于OpenFlow,且添加了Filters、Ternary matching 和Test timeout 等功能.
上述常見的測試工具已經(jīng)部分應用于P4 程序的功能測試.2019 年11 月,ONF 先后發(fā)布了交換機操作系統(tǒng)Stratum 和目前正在開發(fā)中的針對Stratum 交換機測試的Test Vector Framework,該框架正在致力于開發(fā)一系列供應商無關的測試來檢驗目標交換機與Stratum 的一致性.本文著重針對面向P4 編程語言的一致性測試用例生成方法進行相關研究.
軟件測試的覆蓋指標包括語句覆蓋、判定覆蓋、路徑覆蓋等,而面向P4 程序的一致性測試指標定義尚未明確.通過分析P4 程序,我們發(fā)現(xiàn)首部(header)、解析器(parser)、動作(actions)、表(tables)、控制模塊(control blocks)這5 個P4 編程語言的基本組成部分的工作都是與匹配動作表(match-action tables)相關聯(lián),而P4 網(wǎng)絡設備也是通過匹配流水線(pipeline)中的表來執(zhí)行相應處理數(shù)據(jù)包的操作.因此,我們可以通過P4 網(wǎng)絡設備的控制命令來進行面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試,則相應的測試用例為控制命令.
由于每條控制命令所含字段不同,每條字段的合法類型也不同,經(jīng)過分析,本文將面向P4 編程語言的SDN數(shù)據(jù)平面軟件一致性測試用例覆蓋標準確立為:生成足夠的測試用例,使得所有針對match-action tables 操作的控制命令都被執(zhí)行,其中每條命令的每個字段都要覆蓋合法和不合法兩種測試結果.
本節(jié)設計了一致性測試用例自動化生成方法,詳細介紹了P4 程序經(jīng)過編譯、解析、測試用例生成的整個自動化過程.
如圖2 所示,本節(jié)設計的測試用例自動生成方法基本流程為:P4 程序經(jīng)過編譯過程,生成解析過程所需要的P4 信息文件(.p4info 文件)和P4 數(shù)據(jù)平面描述文件;所述P4 數(shù)據(jù)平面描述文件包括JSON 格式的網(wǎng)絡設備配置文件;解析過程包括獲取目標網(wǎng)絡設備控制命令集,依據(jù)每條控制命令格式,從所述P4 程序編譯單元生成的P4信息文件中解析出TABLE_NAME,ACTION_NAME,MATCH_KEY,PARAMETERS 字段信息,最終生成控制信息實體集合;測試用例生成過程劃分了測試用例類型,將所述解析過程生成的控制信息實體集按照測試用例類型組織,最終生成面向P4 編程語言SDN 數(shù)據(jù)平面軟件一致性測試用例集.
p4c 編譯器是為P4 編譯器設計的編譯器基礎設施,同時支持P414以及P416兩個版本的P4 語言.如圖3 所示:p4c 提供了標準的前端和中間件,通過在編譯時添加選項,可以和特定目標的后端相結合使用.p4c 編譯器支持EBPF Backend,BMv2 Backend 和P4test Backend.其中EBPF 能夠生成可以擴展Berkeley 數(shù)據(jù)包過濾程序的C 代碼,BMv2 能夠生成用于簡單的網(wǎng)絡交換仿真的JSON 格式文件,P4test 是一個測試用的后端編譯器.最新的后端編譯器詳情請見https://p4.org/.
圖3 所示為P4 程序的編譯過程,本文使用的是p4c-bm2-ss 來編譯P4 程序,p4c-bm2-ss 是p4c 項目編譯完后的產(chǎn)物之一,具體編譯過程為:p4c 編譯器首先將P414和P416編寫的P4 源程序轉(zhuǎn)換成通用的中間表示IR,然后經(jīng)過前端編譯器,生成為通用的后端中間表示IR 和P4 信息文件(.p4info 文件),中間表示IR 經(jīng)過p4c-bm2-ss編譯生成一個JSON 格式的數(shù)據(jù)文件,此文件專門用于將P4 程序編譯生成BMv2 使用的數(shù)據(jù)平面描述文件.我們研究發(fā)現(xiàn):由于P4 官方提供了一個Helper 類以幫助解析.p4info 文件,該文件格式更加便于處理,因此,.p4info文件可用于P4 表信息的解析過程.
由于面向P4 編程語言的SDN 的實現(xiàn),是通過定義匹配動作表(match-action tables)來部署P4 網(wǎng)絡設備.匹配動作表(match-action tables)是面向P4 編程語言的SDN 實現(xiàn)的關鍵載體,也是體現(xiàn)P4 編程語言特性的重要部分.用戶可以直接把自己對處理數(shù)據(jù)包的需求編寫成P4 程序來部署網(wǎng)絡設備,因而網(wǎng)絡架構師等人員可以通過控制網(wǎng)絡設備、指定轉(zhuǎn)發(fā)行為、填充定義表來實現(xiàn)SDN.而確定裝載P4 程序的網(wǎng)絡設備是否真正實現(xiàn)用戶需求,則需要對目標網(wǎng)絡設備進行一致性測試.一致性測試用例的生成,需要通過解析P4 目標設備的控制命令集來獲取每條命令所需要的表名、匹配字段、動作、動作參數(shù)信息.
· 控制命令信息類結構設計
我們以面向?qū)ο蟮乃枷雭斫?刂泼钚畔ommand 類,該類成員包括CommandName,CommandFormat,TableName,ActionName,MatchField,ActionParameter1,ActionParameter2,如圖4 所示.
· 解析控制命令集
我們研究發(fā)現(xiàn),不同的P4 網(wǎng)絡設備具有不同的控制命令集.生成用于P4 網(wǎng)絡設備的測試用例首先需要解析P4 網(wǎng)絡設備的控制命令集,進而生成包含控制命令頭、控制命令格式以及控制命令字段的控制命令信息實體.本節(jié)設計了用以解析控制命令集的方法,生成控制命令信息實體列表,其工作流程如圖5 所示.
· 解析P4 信息文件
.p4info 文件記錄了P4 程序匹配動作表(match-action tables).P4 官方提供了一個Helper 類,以幫助解析.p4info 文件,實現(xiàn)了根據(jù)id 查找表名、動作名,根據(jù)表名、動作名查詢對應的id、匹配字段、動作參數(shù)的功能.因此考慮從.p4info 文件中解析命令所需要的字段,其工作流程如圖6 所示.
其中,解析.p4info 文件具體過程為:解析命令信息實體命令名稱,解析該命令信息實體所需字段信息,利用Helper 類所提供的方法對.p4info 文件中所有匹配動作表(match-action tables)進行線性查找,將控制命令格式和每個匹配動作表(match-action tables)對應的TABLE_NAME,ACTION_NAME,MATCH_KEY,PARAMETERS 字段信息寫入命令信息實體.
(1) 解析表名
表名層級關系為table→preamble→name.解析表名的流程如圖7 所示,每獲取一個表名,會判斷當前表是否為最后一張表:若有,則繼續(xù)獲取;若沒有,則結束.隨后,所有的表名都會從文件中被提取出來.
(2) 解析匹配字段
匹配字段的層級關系為table→match_fields→(id,name,bitwidth).解析匹配字段的流程如圖8 所示,匹配字段和表名一一對應,輸入表名后判斷該表是否存在:若存在,則能成功獲取匹配字段;否則報錯.在操作正確的情況下,表的對應匹配字段會從文件中被提取出來.
(3) 解析動作
動作名的層級關系為actions→preamble→name.解析動作的流程如圖9 所示,根據(jù)表名獲取該表的所有動作ID 后,根據(jù)ID 獲取動作名,判斷該ID 是否為最后一個ID:若不是,則繼續(xù)獲取ID.表對應的所有動作名都會被從文件解析出來.
(4) 解析動作參數(shù)
動作參數(shù)的層級關系為actions→params→(id,name,bitwidth),解析動作參數(shù)的流程如圖10 所示,根據(jù)動作名判斷該動作是否有參數(shù):若有,則獲取所有參數(shù)的信息;若沒有,則結束.
每解析得到一個命令信息實體,命令信息實體即被插入命令信息實體列表.經(jīng)過以上解析過程,最終生成測試用例所需的命令信息實體集合.
前兩節(jié)生成的命令信息實體集合為面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試用例的生成提供了數(shù)據(jù)基礎,然而測試用例實體的生成需要一定的組織規(guī)范.本節(jié)不僅劃分了測試用例類型,還分別設計了針對每種測試用例類型的測試用例構造方法.測試用例生成方法可分為生成單條測試用例和批量生成全部測試用例.
· 測試用例類型
本節(jié)依據(jù)測試用例結果類型,將最終生成的測試用例實體分為5 種類型:命令合法、表名不合法、動作不合法、匹配域不合法、參數(shù)不合法.
· 構造測試用例
單條測試用例生成過程為:用戶依次選擇測試用例類型、控制命令類型,再根據(jù)命令類型所需字段選擇或編輯表名、動作名、匹配域、參數(shù)信息,最后生成單條測試用例.
批量生成全部測試用例集的過程為:以測試用例類型為組織單位構造測試用例,遍歷解析過程生成的命令信息實體列表.若測試用例類型為命令合法,則直接依據(jù)每個命令信息實體的命令格式和字段信息構造測試用例;若測試用例類型為表名不合法,則將命令信息實體中的TABLE_NAME 字段修改為錯誤的TABLE_NAME字段,再依據(jù)命令格式與其他字段信息構造測試用例;同理,動作不合法、匹配域不合法、參數(shù)不合法類型的測試用例構造方法與命令不合法類似.
本節(jié)以裝載P4 程序的simple_switch 虛擬交換機為測試對象,說明一致性測試用例生成過程.
simple_switch 虛擬交換機的控制命令集如圖11 所示.
由于控制命令集包含許多功能類似的表項操作命令,并且不同的P4 網(wǎng)絡設備控制命令集并不完全相同,因此,本實驗并沒有對全部控制命令生成一致性測試用例,而是選取simple_switch 虛擬機中具有代表性的表操作控制命令table_add,table_delete,table_dump,table_modify 來生成一致性測試用例.
· table_add 表項增加命令
合法的增加表項的命令格式如下:
插入一個表項需要確定表名、動作名、匹配域、動作參數(shù).以命令“table_add ipv4_lpm drop 0/32 0/32?0”為測試用例進行說明.其中,ipv4_lpm 指定了該命令是向ipv4_lpm 這張表插入表項,ipv4_forward 指定了表項匹配成功時執(zhí)行的動作為ipv4_forward,0xffffffff/32 指定了匹配字段是16 進制的ffffffff,?是命令的格式需要所定義的箭頭形狀,?后的0x0 0x0 指定了ipv4_forward 動作的兩個參數(shù)均為0,命令中的動作需要幾個參數(shù),?符號后就應當給出幾個參數(shù).命令中/后的數(shù)字如0/32 表示的是該數(shù)長度為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 表項修改命令
合法的修改表項的命令格式如下:
修改表項需要確定表項所在表的表名、表項中的動作名、表項的編號、動作的參數(shù).以命令“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 的兩個參數(shù)改成0x123456654321 1.命令要修改的表項中的動作有幾個參數(shù),就要給出幾個參數(shù).
如圖12 所示為測試用例生成的算法映射圖,以測試用例類型命令合法、表名不合法、動作不合法、匹配域不合法、參數(shù)不合法為組織單位,以一個個命令信息實體為信息體,構造對應類型的 TABLE_NAME,ACTION_NAME,MATCH_KEY,PARAMETERS 字段,生成table_add,table_delete,table_dump,table_modify 命令.
如圖13 所示,本節(jié)以增刪改查命令類型的測試用例生成過程為例進行說明.在完成了對P4 信息文件(.p4info 文件)的解析后,以測試用例類型為組織單位,構造符合測試用例類型的字段,依據(jù)命令信息實體的命令格式,生成測試用例.表項的增加和修改動作需要用到表名、匹配字段、動作名和動作參數(shù),而表項的查詢和刪除命令需要用到表名.本節(jié)實現(xiàn)的SDN 數(shù)據(jù)平面軟件一致性測試用例生成工具不直接依賴于P4 程序,而是直接依賴于編譯后的P4 信息文件(.p4info 文件).
· 參數(shù)默認值的設定原則
命令中,用戶需要自行填寫的參數(shù)有匹配字段(match_field)和動作參數(shù)(action_params),這兩個參數(shù)不能由.p4info 確定,需要用戶根據(jù)從.p4info 文件中提取出參數(shù)的位數(shù)自行填入.程序可以識別十進制數(shù)并轉(zhuǎn)換成十六進制,但是交換機中記錄的是十六進制的格式,目前的IP 地址格式是32 位二進制數(shù).為了方便也分成了4 段,每段8 位.考慮到以十進制數(shù)表示IP 地址不直觀也非當今主流,所以需要根據(jù)參數(shù)的位數(shù)給出一個默認的參數(shù),以確定一個參數(shù)的格式.匹配字段中的參數(shù)往往是目的地址或者是源地址之類的IP 地址.匹配字段的長度必須是8bits 的整數(shù)倍.參考參數(shù)見表1.
Table 1 Reference parameters表1 參考參數(shù)
· 單個測試用例示例
本節(jié)設計了測試用例實體結構,每個測試用例實體分為4 部分:命令格式CF(CommandFormat)、前提條件PC(Precondition)、測試用例TC(TestCase)、期望輸出結果EO(ExpectedOutput).設計該結構的目的在于規(guī)范測試用例實體,使測試用例實體信息更加清晰明了,方便面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試實際結果與預期結果比對過程.前提條件PC 和期望輸出結果EO 為測試系統(tǒng)初期部署過程所作工作,本文不作贅述.
圖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,匹配成功則向表中插入?yún)?shù)為0x0 和0x0 的動作myTunnel_ingress.
· 測試用例集示例(如圖15 所示)
本節(jié)對我們已經(jīng)實現(xiàn)的SDN 數(shù)據(jù)平面軟件一致性測試用例自動生成工具進行一致性測試用例生成測試實驗,該實驗選取了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 條被測控制命令通過一致性測試用例自動生成工具進行一致性測試用例生成測試.我們發(fā)現(xiàn):生成測試用例的實際結果與預期結果完全一致,每條被測命令生成的測試用例集都覆蓋了該控制命令字段所有可能出現(xiàn)的情況,實現(xiàn)了全覆蓋.則以上實驗驗證了面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試用例自動生成工具具有有效性.
Table 2 Test case automatic generation tool test data table表2 測試用例自動生成工具測試數(shù)據(jù)表
測試用例生成工具的界面如圖18 所示,在用戶選定.p4info 文件的后,點擊Write In 按鈕,則生成.p4info 文件對應的全部測試用例.在選定.p4info 文件后,依次選擇table、actions 下拉框,隨后讀取match_field 和action_params,點擊Generate entry 按鈕,即在下方空白處顯示表項的信息.
面向P4 編程語言的一致性測試本質(zhì)上是在將測試用例發(fā)送給P4 網(wǎng)絡設備,通過比較實際輸出和預期輸出的一致程度,保證了P4 網(wǎng)絡設備在錯綜復雜的網(wǎng)絡環(huán)境中的表現(xiàn)與預期表現(xiàn)一致性.測試用例是執(zhí)行一致性測試的載體,傳統(tǒng)的人工構造測試用例是一項繁瑣耗時費力的工作.本文介紹了SDN 架構、P4 編程語言特性,調(diào)研了SDN 領域一致性測試現(xiàn)有工作情況,設計了用于面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試用例生成方法,實現(xiàn)了面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試用例自動生成工具.實驗結果表明:該測試工具能夠由用戶自己選擇或編輯生成單條測試用例,也可以按照預期生成任意P4 程序的測試用例集.
除此之外,在實際應用中,本文工作還有進一步提升空間.
本文是面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試用例生成研究工作,在本文工作的基礎上,可以針對P4 編程語言的SDN 數(shù)據(jù)平面軟件進行真實網(wǎng)絡環(huán)境下的一致性測試工作研究;
面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試過程需要包括測試環(huán)境搭建、測試系統(tǒng)初期部署、一致性測試用例生成、一致性測試等階段.后續(xù)工作可以設計面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試一體化過程,可以基于gRPC 框架對真實網(wǎng)絡環(huán)境下的測試用例的發(fā)送、測試服務調(diào)用和測試結果接收過程進行研究.
交換機操作系統(tǒng)Stratum 支持P4 API、P4Runtime API,可以基于本文提出的面向P4 編程語言的SDN 數(shù)據(jù)平面軟件一致性測試用例生成方法進行Stratum 交換機一致性測試的研究.