Metallurgy in Computer Science

資訊冶金,不僅僅是技術上的紀錄,還有一些生活經驗啥的

0%

Debug p4lang/tutorial runtime misbehavior

最近寫碩論要用到這東西,雖然說我們實驗室有一兩台可編程交換機(Programmable Switch)的硬體,但是由於想做的是資料中心的場景,所以數量上不去只能用軟體模擬了

這篇文章的目的是幫助各位跟我一樣的新手了解要怎麼 debug BMv2 執行時的問題,也就是說下文並不會牽扯到編譯時期的問題(這部份 Bmv2 好像有類似 gdb 的東西),而是純粹「我今天可以編譯過了,但是交換機的行為怎麼不是我想像的那樣?」


什麼是 Bmv2

我想會找到這篇文章的人應該都知道什麼是 Bmv2 才會點進來的吧… 不過還是就我所知道的講一下好了

要講 Bmv2 就一定要提到可編程交換機,因為 Bmv2 就只是用軟體的方式模擬交換機硬體的行為

可編程交換機呢,就是比較彈性的交換機,原本的交換機只能處理固定格式的封包,如果今天作為實驗想自己定義一個新的格式的封包,那麼很可惜交換機會完全不知道怎麼處理這邊的新格式,你可能就只能把新格式疊在現存的格式上,作為它的 payload,丟給兩邊的服務器處理

可編程交換機的實現原理,就我所知道的類似用到 FPGA 的概念,我們可以用硬體描述語言去改變他的硬體行為

這可能也是為啥 P4 長的非常像 verilog

Bmv2 的語法可能跟硬體有區別

首先要用 Bmv2 的話,直接照 P4 規格書來走應該是沒問題的
目前用起來還沒有該實現卻沒有的情形(可能跟我很菜也有關)
眾所周知的 P4 有兩個主流版本,P4_14 與 P4_16
像是 Bmv2 我用的支援就是 P4_16,不過我相信 P4_14 應該也會有
由於這兩個語法差很多,基本上不可能混用
但是就交換機硬體實現上,基本上就是一個混亂邪惡
像我們實驗是用的交換機是 Barefoot 的,它的語法是改自 P4_14 的
會說是「改」就是因為它沒有完全符合(比較委婉的講法)
像是某些單元運算它沒有實做(恭喜你要用對數表做 work-around 了)
然後也加加減減一些功能(另一篇文章有簡單提到,不過由於他們規格書好像是保密的,所以也不能講太多)
所以如果今天要把實驗從軟體環境移到硬體上,你的 P4 可能要動不少刀

BMv2 on mininet

基本上你因為要模擬可編程交換機,所以要用 Bmv2 這東西,基本上應該都一定會綁定要 Mininet 環境

Mininet 簡單講一下它就是方便你做網路區隔的,你可以弄出很多不同子網的節點然後用你喜歡的方式接在一起(一個比較有趣的點就是它並不是靠硬體虛擬化的方式,應該說不是走虛擬機那套的,而是只是把不同 terminal 的網路劃開來,用虛擬網路加橋接網路之類的我猜,畢竟我沒研究所以不確定,所以你的目錄下的東西應該是共享的,然後對效能影響也不是很大)

我比較推薦的還是從 p4lang/tutorial p4d2-2018-2018 branch 下手,你當然也可以去看它原生的編譯器然後嘗試自己把整個流程搞清楚(我好像有試過,但是牆內的環境搞的我很想死,牆內的朋友最近如果要裝的話可以參考我的 forked repo,不過隨時間過去可能會不管用)

tutorial 裡的範例都挺適合直接拿來改的,詳細的文件會讓你知道哪邊需要改哪邊不用,如果你想做的實驗跟範例類似,那麼絕對是推薦你直接拿範例來改,會少掉很多有的沒的痛苦

以下的部份也會基於這個環境(p4lang/tutorial)講下去

Misbehavior of Bmv2

這邊的 Misbehavior 我的定義是 「不符合預期的行為」,比如你想弄一個簡單的 source routing 像是把拓樸改一下然後自己調整一下控制平面的指令,然後就發現現在 ping 不通了(或者是比較尷尬的 network unreachable)

「比較尷尬的 network unreachable」

之前調拓樸之後改了 IP 就發現出現這個錯誤訊息
需要注意的是 gateway 需要跟底下的 host 處在同一個子網
比如說你 host IP 10.0.1.1/32 然後 route add default gw 10.0.1.10 dev eth0
由於 10.0.1.1/32 跟 10.0.1.10 不視同一個子網所以就會跳這個錯誤訊息
比較諷刺的是,就算根本沒有 10.0.1.10 這台機器,它還是會報錯
這根據我的猜測是因為 linux network stack 要求
但如果真的是這樣,那這個 Switch 不能設定 IP 原因就有點自打嘴巴

Welcome to my other publishing channels