P4-可程式語言程式碼學習
(1).behavioral-model
簡稱bmv2
P4程式首先經過p4c-bm模組編譯成JSON格式的配置檔案,然後將配置檔案載入到bmv2中,轉化成能實現交換機功能的資料結構。
behavioral-model模組最重要的是simple-switch,即實現P4語言標準中抽象交換機模型,另外兩個目標是(simple_router,l2_switch)
(2)p4-hlir
將P4程式碼轉換成高階中間表示的前端編譯器,該編譯器的目的是使得後端編譯器開發者從語法分析和目標無關的語義檢查的負擔中解放出來。
(3)p4c-bm
behavior model的後端編譯器,建立在p4-hilr的頂部,該模組以P4程式作為輸入,輸出一個可以載入到behavioral model的JSON配置檔案
(4) P4-build
需要手動生成的基礎設施庫,為執行P4程式編譯、安裝PD庫
(5)switch
內含switch.p4程式樣例以及通過SAI、SwitchAPI和Switchlink操作交換機所需的所有庫,可獨立於p
4factory執行
(6)ntf(Network Test Framework)
網路測試框架,內含用以執行bmv2上應用的網路測試樣例,該框架中集成了mininet和docker,方便使用者進行測試
(7)p4factory
內含整套用以執行和開發基於behavioral model的P4程式環境的程式碼,幫助使用者快速開發P4程式。
(8)ptf
資料平面測試框架,基於unittest框架實現,內含標準Python版本。該框架中的大部分程式碼從floodlight專案中的OFTest框架移植而來,框架的實現和開發可參考OFTest框架文件。
(9)scapy-vxlan
基於Scapy專案,barefoot對其進行了定製,支援更多協議的資料包包頭的偽造和解析,目前支援 VXLAN和ERSPAN-like(Scapy本身並不支援)。
2.1 基礎資料型別及操作
P4語言中定義了5種基礎資料型別,分別是:bool、bit、int、varbit、int。(注:此處W代表長度,通常使用十進位制數字表示,如bit)通常情況下,不同的資料型別之間可以相互轉換,並且所有的二目運算子都要求資料型別保持一致,除了位移操作符(shifts)。
(1)布林型(bool)
布林型(Boolean),值為true或false,非整數型。布林型別資料可進行如表1所示運算。
運算子 |
描述 |
and |
二目運算子,運算元必須都為布林型,運算結果為布林型。 |
or |
二目運算子,運算元必須都為布林型,運算結果為布林型。 |
not |
單目運算子,運算元必須為布林型,運算結果為布林型。 |
==,!= |
測試是否相等或不等,運算結果為布林型。 |
表1 布林型支援的運算
(2)無符號整型(bit)
無符號整型(unsigned integers)也叫位串(bit-string)。位串是以位元位形式表示的任意長度的數(如:bit,表示長度為127位元的位串),但如果需要對位串進行某些數學運算時,位串長度必須是8的整數倍(如:16、32、64bit)。無符號整型支援如表2所示運算。
運算子 |
描述 |
==,!= |
測試是否相等或不等,運算結果為布林型。 |
<,>,<=,>= |
無符號數比較,運算元的長度(W)要求相同,運算結果為布林型。 |
&,|,^ |
按位運算子,運算元的長度(W)要求相同,運算結果為無符號整型。 |
~ |
運算結果為運算元的補碼。 |
<<,>> |
左移運算子運算元為無符號整型,右移運算子運算元必須是無符號數或非負整數。此運算子為邏輯位移。 |
+(單目) |
單目加運算,效果同no-op。 |
-(單目) |
單目減運算,計算結果為2W減去運算元,W為運算元長度。 |
+(雙目) |
二目加運算,運算元的長度(W)要求相同。計算結果為運算元的算術和,且運算結果長度也必須為W,超過則截斷。 |
-(雙目) |
二目減運算,運算元的長度(W)要求相同。計算結果為運算元的算術差。 |
* |
無符號乘法運算,運算元的長度(W)要求相同,計算結果為無符號數且長度與運算元相等。 |
表2 無符號整型支援的運算
3)有符號整型(int(W))
有符號整型(signed integers)支援如表3所示運算。
運算子 |
描述 |
==,!= |
測試是否相等或不等,運算結果為布林型。 |
<,>,<=,>= |
有符號數比較,運算元的長度(W)要求相同,運算結果為布林型。 |
&,|,^ |
按位運算子,運算元的長度(W)要求相同,運算結果為無符號整型。 |
~ |
運算結果為運算元的補碼。 |
<<,>> |
左移運算子運算元為有符號整型,右移運算子運算元必須是無符號數或非負整數。此運算子為邏輯位移。 |
+(單目) |
單目加運算,效果同no-op。 |
-(單目) |
單目減運算,運算結果有符號整型,且長度與運算元相等。 |
+(雙目) |
二目加運算,運算元資料型別必須相同,運算結果也為同類型。 |
-(雙目) |
二目減運算,運算元資料型別必須相同,運算結果也為同類型。 |
* |
有符號乘法運算,運算元的長度(W)要求相同,計算結果為有符號數且長度與運算元相等。 |
表3 有符號整型支援的運算
(4)變長位串(varbit)
變長位串(dynamically-sized bit-strings)不支援算術、比較、按位運算,甚至不支援型別轉換。該資料型別在定義時會指定一個靜態的最大寬度值,解析器會提取變長位串資料並設定一個值作為長度。
(5)無限精度整型(int)
無限精度整數(infinite-precision integers)支援如表4所示運算。
運算子 |
描述 |
==,!= |
測試是否相等或不等,運算元必須都是整型(int)運算結果為布林型。 |
<,>,<=,>= |
有符號數比較,運算元型別都必須是整形,運算結果為布林型。 |
<<,>> |
右移運算子運算元必須為正整數;左移運算結果和運算元相同。a<<b等價於ax2b,a>>b等價於a/2b。 |
+(單目) |
單目加運算,效果同no-op。 |
-(單目) |
單目減運算,運算結果為整型,且該運算不會導致溢位。 |
+(雙目) |
二目加運算,運算元型別都必須是整型,運算結果為整型,且該運算不會導致溢位。 |
-(雙目) |
二目減運算,運算元型別都必須是整型,計算結果為整型,且該運算不會導致溢位。 |
* |
無符號乘法運算,運算元必須都是整形,計算結果為整形,該運算不會導致溢位。 |
/,% |
二目有符號除法和取模運算,運算元必須是正整數,運算結果為正整數。 |