# P4 11 ECN/Firewall ## 龍帆軒 20201207 ### ECN Topology : ![](https://i.imgur.com/SSLRO94.png) 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 ![](https://i.imgur.com/5H0GY8p.png) 在 ```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 ![](https://i.imgur.com/gmpLfpe.png) ![](https://i.imgur.com/9EIwvg2.png) #### 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 : ![](https://i.imgur.com/6iRSV0v.png) 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可以自由連接 ![](https://i.imgur.com/vw2vSMX.png) 首先會先檢查這個封包在 ```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擋住外部的連線 ![](https://i.imgur.com/td3350j.png) 如果沒有 firewall 執行結果會是下圖 ![](https://i.imgur.com/MUGFyBW.png) >```iperf h3 h1```有連線 ###### tags: `P4`