# 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 如下

首先新增 header
```
struct headers {
ethernet_t ethernet;
ipv4_t ipv4;
ipv4_option_t ipv4_option;
mri_t mri;
switch_t[MAX_HOPS] swtraces;
}
```
再將 Parse的邏輯建立好

接下來的 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比較大

如果沒有iperf時 qdepth就會是空的

#### IPERF
Iperf 是一個 TCP/IP 和 UDP/IP 的性能測量工具
能夠提供網路吞吐率訊息,以及震動、丟包率、最大段和最大傳輸單元大小等資訊
##### 參數說明 :
-s 以server模式啟動
-u 以UDP封包代替TCP封包
-t 每隔多少秒傳輸一次 (default=10)
-c host以client模式啟動,host是server端地址
###### tags: `P4`