---
# System prepended metadata

title: P4 13
tags: [P4]

---

# P4 13
## 龍帆軒 20201221
### MRI
Multi-Hop Route Inspection 
MRI 可以讓 user 追蹤路徑與 queue 的長度

一個簡單的 mri.p4 需要以下的原件 : 
1. ethernet_t ipn4_t ipv4_option_t mri_t and switch_t 的header定義
2. parser 來 parse 上述的 header
3. 一個用來丟棄封包的 action ```mark_to_drop()```
4. 簡單的 ipv4 forward 來傳送封包
5. 一個 ingress control 定義一個 table 來選擇丟棄或傳送
6. 一個 control 在封包出去時會將 switch ID 與 queue depth 加上
7. 一個 egress control 
8. deparser
9. package

Topology 如下
![](https://i.imgur.com/6wvRIzg.png=300x300)

首先新增 header
```
struct headers {
    ethernet_t         ethernet;
    ipv4_t             ipv4;
    ipv4_option_t      ipv4_option;
    mri_t              mri;
    switch_t[MAX_HOPS] swtraces;
}
```

再將 Parse的邏輯建立好
![](https://i.imgur.com/sKPYTUH.png=300x300)

接下來的 ingress control 就只是基本的 forwarding

egress comtrol 裡要將switch 的追蹤寫好
1. mri.count +1 (經過switch數量+1)
2. 因為要紀錄switch ID 所以要 push 新的 switch_t header 進去 swtraces
3. 根據 p4_16 spec 放東西進去是 invalid 所以要 ```hdr.swtraces[0].setValid()```
4. 設定好 switch_id 跟 depth
5. ipv4 裡的 ihl 要增加 2 (internet header length)
7. optionlen 跟 totallen 要+8




#### 執行結果 : 

在 h2 執行 ```./recieve.py```
在 h22 執行 ```iperf -s -u```
在 h1 執行 ```./send.py 10.0.2.2 "test MRI" 30```
>後面的30是傳30秒

在 h11 執行 ```iperf -c 10.0.2.22 -t 15 -u```
>15是15秒傳一次

當有iperf傳輸時因為s1跟s2之間只有一條通道 所以會看到 depth比較大
![](https://i.imgur.com/7otWAB2.png=50%x50%)

如果沒有iperf時 qdepth就會是空的 
![](https://i.imgur.com/ci6F7FS.png=50%x50%)



#### IPERF
Iperf 是一個 TCP/IP 和 UDP/IP 的性能測量工具
能夠提供網路吞吐率訊息，以及震動、丟包率、最大段和最大傳輸單元大小等資訊

##### 參數說明 : 
-s 以server模式啟動

-u 以UDP封包代替TCP封包

-t 每隔多少秒傳輸一次 (default=10)

-c host以client模式啟動，host是server端地址

###### tags: `P4`