# P4 11 ECN/Firewall
## 龍帆軒 20201207
### ECN
Topology :

ECN.p4 需要以下這些元件
1. Ethernet 跟 IPv4 的 header
2. Ethernet 跟 IPv4 的 parser
3. 用來丟棄封包的 action ```mark_to_drop()```
4. 基本 ipv4 foward 的 action
5. 一個 egress control 來檢查 ECN 跟 ```standard_metadata.enq_qdepth``` 還有設定 ipv4.ecn
6. 一個 deparser 將 fields 以正確順序放入要出去的 packet
7. 一個 package instantiate
將 ipv4 header 其中 8-bit 的 tos 再細分成 2-bit ECN 與 6-bit diffserv
```
/*bit<8> tos*/
bit<6> diffserv;
bit<2> ecn;
```
在egress新增control判斷如果ECN==1 或 2 會比較 ```standard_metadata.enq_qdepth``` 跟 threshold 如果比較把再設定 ```hdr.ipv4.ecn``` 為 3

在 ```MyComputeChecksum()``` 修改 tos 新增 diffserv 跟 ecn
```
/*hdr.ipv4.tos,*/
hdr.ipv4.diffserv,
hdr.ipv4.ecn,
```
完成後執行 ```make```建立mininet
執行```xterm h1 h2 h11 h22```
分別在h1 h2 執行 ```send.py 10.0.2.2 "steven is cool 30"``` 跟 ```recieve.py```
> ```send.py``` 後的 30 是 封包傳送 30 秒的意思
分別在h11 h22 執行 ```iperf -c 10.0.2.22 -t 15 -u``` 跟 ```iperf -s -u```
可以看到h2的recieve 封包裡的 tos值在 iperf 開始時會變成 3
iperf 結束後會變成 1


#### IPERF
Iperf 是一個 TCP/IP 和 UDP/IP 的性能測量工具
能夠提供網路吞吐率訊息,以及震動、丟包率、最大段和最大傳輸單元大小等資訊
參數說明 :
-s 以server模式啟動
>eg:iperf -s
-c host以client模式啟動,host是server端地址
>eg:iperf -c 222.35.11.23
### Firewall
Topology :

firewall.p4需要有以下的components
1. Ethernet (ethernet_t), IPv4 (ipv4_t) and TCP (tcp_t) 的header
2. Ethernet (ethernet_t), IPv4 (ipv4_t) and TCP (tcp_t) 的parser
3. 一個action來丟丟棄封包
4. 一個action來運算bloom filter的兩個hash
5. 基本的ipv4 forwarding
6. 一個action來設置一個變數來存action的參數
7. 一個table來讀封包的ingress和egress並且使用到 6. 的action
8. 一個control用來
9. 一個deparser用來emit Ethernet (ethernet_t), IPv4 (ipv4_t) and TCP (tcp_t) 封包
10. 一個 ```package``` instantiation
這個 firewall 可以將來自外部的 host 阻擋而內部的h1 h2可以自由連接

首先會先檢查這個封包在 ```check_ports```有沒有hit
有的話就會進入 compute hash
之後會分這個分包是從internal 還是 external 來的
如果是 internal 會再看有沒有 syn
有的話就會重新設定 bloom filter
如果封包是 external就會讀取bloom filter
如果兩邊的flow entries都有設定便會讓封包通過
執行 ```make run``` 建立mininet
執行 ```iperf h1 h2``` 會看到h1 h2有成功連線
執行 ```iperf h1 h3``` 也會看到h1 h3有連線
執行 ```iperf h3 h1``` 會沒有東西因為被firewall擋住外部的連線

如果沒有 firewall 執行結果會是下圖

>```iperf h3 h1```有連線
###### tags: `P4`