準備工作
在官網下載p4的虛擬機之后在virtualbox上運行
虛擬機是在https://p4.org/events/2018-06-06-p4-developer-day/里找到的
下載鏈接如下(需要翻墻)
https://drive.google.com/uc?id=1f22-DYlUV33DsR88_MeMb4s7-1NX_ams&export=download
打開虛擬機之后就可以按GitHub里的tutorials進行學習
第一個是驗證實施基本轉發(Implementing Basic Forwarding)
但是basic這個文件夾里的basic.p4文件是不完整的,運行這個原本的basic.p4沒有收到消息,因為每個交換機都是按照編程的basic.p4,它會在到達時丟棄所有數據包。需要填充以下內容(您的交換機將具有單個表,控制平面將使用靜態規則填充該表。每個規則都會將IP地址映射到下一跳的MAC地址和輸出端口。我們已經定義了控制平面規則,因此您只需要實現P4程序的數據平面邏輯。)
在solution文件夾里有一個官方提供的完整的可以參考一下的basic.p4文件。
## 官網教程
### 第1步:運行(不完整的)入門代碼
在擴展basic.p4文件之前,讓我們編譯不完整的basic.p4并在Mininet中調出一個開關來測試它的行為。
在你的shell中,運行:
```
make run
```
這會:
- 編譯basic.p4,和
- 啟動一個Mininet實例與三個開關(s1,s2,s3)以三角形構造中,每個連接到一個主機(h1,h2,和h3)。
- 該主機被分配的IP地址10.0.1.1,10.0.2.2和10.0.3.3。
您現在應該看到Mininet命令提示符。打開兩個端子h1和h2,分別為:
```
mininet > xterm h1 h2
```
每個主機都包含一個基于Python的小型消息傳遞客戶端和服務器?在h2的xterm中,啟動服務器:
```
./receive.py
```
在h1的xterm中,發送消息給h2:
```
./send.py 10.0.2.2?"P4 is cool"
```
將不會收到該消息。
鍵入exit以保留每個xterm和Mininet命令行。然后,停止mininet:
```
make stop
```
并刪除所有pcaps,構建文件和日志:
```
make clean
```
沒有收到消息,因為每個交換機都是按照編程的basic.p4,它會在到達時丟棄所有數據包。您的工作是擴展此文件,以便轉發數據包。
#### 關于控制平面的說明
P4程序定義了數據包處理流水線,但每個表中的規則都由控制平面插入。當規則與數據包匹配時,將使用控制平面提供的參數作為規則的一部分來調用其操作。
在本練習中,我們已經為您實現了控制平面邏輯。作為啟動Mininet實例的一部分,該?make run命令將在每個交換機的表中安裝數據包處理規則。這些在sX-runtime.json文件中定義,其中?X對應于交換機編號。
重要提示:我們使用P4Runtime來安裝控制平面規則。文件內容是sX-runtime.json指表,鍵和操作的特定名稱,如編譯器生成的P4Info文件中所定義(build/basic.p4info執行后查找文件make run)。添加或重命名表,鍵或操作的P4程序中的任何更改都需要反映在這些sX-runtime.json文件中。
### 第2步:實施L3轉發
該basic.p4文件包含一個骨架P4程序,其中關鍵的邏輯部分被TODO注釋替換。您的實現應遵循此文件中給出的結構---將每個TODO實現替換為實現缺失部分的邏輯。
完整basic.p4包含以下組件:
以太網(ethernet_t)和IPv4(ipv4_t)的標頭類型定義。
TODO:
- 用于填充ethernet_t和填充以太網和IPv4的解析器ipv4_t。
- 使用丟棄數據包的操作mark_to_drop()。
TODO:
- 一種行動(稱為ipv4_forward):
- 設置下一跳的出口端口。
- 使用下一跳的地址更新以太網目標地址。
- 使用交換機的地址更新以太網源地址。
- 減少TTL。
TODO:
- 一個control:定義一個表,該表將讀取IPv4目標地址,并調用其中一個drop或ipv4_forward。
- apply應用表的塊。
TODO:
- 一個deparser,用于選擇字段插入傳出數據包的順序。
- package解析器,控件和解析器提供的實例化。
通常,包還需要校驗和驗證和重新計算控制的實例。這些不是本教程所必需的,而是替換為空控件的實例化。
### 第3步:運行您的解決方案
按照步驟1中的說明進行操作。這次,您的消息?h1應該發送到h2。
**值得深思**
“測試套件”為您的解決方案---從發送消息h1到?h2---不是很強勁。您應該測試什么才能對您的實施充滿信心?
雖然Python?scapy庫超出了本教程的范圍,但它可用于生成用于測試的數據包。該send.py文件顯示了如何使用它。
其他需要考慮的問題:
您如何增強您的計劃以支持下一跳?
這個程序足以取代路由器嗎?少了什么東西?
故障排除
在開發程序時可能會出現幾個問題:
basic.p4可能無法編譯。在這種情況下,make run將報告編譯器發出的錯誤并暫停。
basic.p4可能編譯但無法支持嘗試使用P4Runtime安裝的s1-runtime.json直通s3-runtime.json文件中?的控制平面規則make run。在這種情況下,make run如果無法安裝控制平面規則,將報告錯誤。使用這些錯誤消息來修復您的basic.p4實現。
basic.p4可能會編譯,并且可能會安裝控制平面規則,但交換機可能無法以所需方式處理數據包。這些/tmp/p4s..log文件包含描述每個交換機如何處理每個數據包的詳細日志。輸出詳細,可以幫助查明實現中的邏輯錯誤。
```
clean mininet
```
在上面的后兩種情況中,make run可能會在后臺運行Mininet實例。使用以下命令清除這些實例:
```
make stop
```
## 下一步
恭喜,您的實施工作正常!在下一個練習中,我們將在此基礎上構建并添加對基本隧道協議的支持:basic_tunnel!