實驗内容
針對P4 Tutorials---- source routing實驗最後提出的問題。
如何使壓入标簽的動作在第一跳網絡裝置上執行,這樣應該使更貼近現實中的網絡場景。
實驗前,我們先看一下h1 ping h2是不通的。因為和./send.py 發的帶标簽的包不同,直接ping的是普通的ipv4包,但是switch現在沒有轉發ipv4封包的邏輯。
拓撲圖
Switch邏輯示意圖:
我們這次實驗要做是ipv4的資料包進入後在第一個switch壓入指導轉發的标簽棧,後面的switch就所需要做的是彈出标簽,從相應的端口送出資料包。
以S1為例:
- IPv4封包進到S1後改變Type類型為0x1234,壓入兩個标簽,注意要先壓入離目的端近的标簽。
2. 封包出S1的Port2口并彈出一層标簽,到達S2
3.封包出S2時,彈出一層标簽,修改Type為0x0800
操作步驟
這裡主要介紹一下相比source routing實驗增加的代碼。
Parser:
如果ehterType是IPV4,轉到parse_ipv4
Ingress:
如果進來的是ipv4的資料包,壓入兩個标簽
Egress:
增加一個table ipv4_final ,如果比對目的ip,替換目的mac
Checksum computation
資料包改變做校驗。
添加Switch規則
CLI 登入到S1和S2
S1添加規則:
table_add ipv4_lpm_add addlabel 10.0.2.2/32 => 1 1
table_add ipv4_lpm_add2 addlabel2 10.0.2.2/32 => 2 0
table_add ipv4_final dmac 10.0.1.1/32 => 08:00:00:00:01:11
S2添加規則:
table_add ipv4_lpm_add addlabel 10.0.1.1/32 => 1 1
table_add ipv4_lpm_add2 addlabel2 10.0.1.1/32 => 2 0
table_add ipv4_final dmac 10.0.2.2/32 => 08:00:00:00:02:22
測試
現在h1可以ping通h2
通過wireshark,我們可以在pcap的目錄下看到抓包記錄。
這裡依次截出了從h1到h2 ping的封包轉發全過程
S1 eth1 是一個IPv4包。
S1 eth2送出去時,帶着一層标簽。
因為自定義的type,是以wireshark不能完全識别這個包。
但是我們可以通過type 1234判斷後面的16bit(80 01)是soure route的标簽,換算成二進制1000 0001。
對照開始定義的srcRoute_t,第1個bit是表示bos,後面15個bit是表示端口号。
S2 eth1出來IPv4包。
實驗代碼https://mp.csdn.net/mp_download/creation/uploadResources/85182479