# P4 06
## 龍帆軒
進行 basic tunneling ,tunneling是可以將不同protocol下的封包在不更改protocol情況下往前傳送
使用的拓樸如下:

### Basic Tunneling
在exercises/basic_tunneling 裡面輸入```make run``` 建立mininet
在分別使用xterm開出host1跟host2 ```xterm h1 h2```
之後在h2 輸入```./receive.py ```來接收等等的封包
首先測試看看一般不使用tunneling下封包的傳送
在h1輸入 ```./send.py 10.0.2.2 “hi I am steven”```

>看到h2有成功收到封包 有ethernet TCP IP的header
接下來使用tunneling
在h1輸入```./send.py 10.0.2.2 “hi I am steven” –dst_id 2```

>h2收到的封包會多一個tunnel的header
此時如果試試看使用tunnel但是把destination ip 設為h3
h1輸入```./send.py 10.0.3.3 “hi I am steven” –dst_id 2```

>還是在h2被收到,原因是switch在有tunnel header的情況下並不會使用ip來routing
### run_excercise.py
從main開始看
先進去```args=get_args()```

>get_args()大概就是在處理一開始輸入的arguments
接下來執行到的是下面這行指令:
```python=
exercise = ExerciseRunner(args.topo, args.log_dir, args.pcap_dir, args.switch_json, args.behavioral_exe, args.quiet)
```
之後在main執行到的是 ```exercise.run_exercise()```

>建立ExerciseRunner這個物件時,init會將許多參數與變數設定好與讀取 topology.json
ExerciseRunner 的```run_exercise()```大致上就是建立mininet
Create_network()

>建立mininet網路然後將它存在self.net這個變數裡
其中 ConfigureP4Switch()

>確認每個switch的thrift server都使用獨立的port
使用到從p4runtime_switch import 來的 P4RuntimeSwitch class
Thrift
>被當作RPC框架使用,可以定義一個服務或改變通訊和傳輸協議,而無需重新編譯code。
RPC
>remote procedure control該協定允許執行於一台電腦的程式呼叫另一個位址空間的子程式
ExerciseTopo()
>p4 tutorial exercise裡面的topology class,設定好topology
回到一開始的run_exercise()
Program_hosts()
>在每個host下執行topology.json裡面的指令
Self.do_net_CLI()
>建立mininet CLI,並且output一些有用的訊息

>每次make run看到的成功訊息便是在Self.do_net_CLI()裡面print的
###### tags: `P4`