- Today
- Total
Byeo
0. P4 tutorial 환경 구성 본문
P4 tutorial을 따라해보기 위해서 환경을 구성합니다.
P4 tutorial GitHub repository: https://github.com/p4lang/tutorials/
P4 tutorial에는 P4 language를 사용하여 Basic forwarding / tunneling switch부터 calculator, LB(!!), stateful 까지 여러 주제들을 구현하는 과제를 제공합니다.
단, P4를 사용할 수 있는 환경을 구성하는 것이 먼저라서, 이 포스트에서는 p4 tutorial에서 제안된대로 환경 구성을 먼저 진행해봅니다.
이 튜토리얼을 진행하기 위해서 P4 개발 도구를 host에 설치할지 혹은 이미 설치된 VM을 통째로 받을지 선택해야 합니다.
1. 직접 설치하기
VM이 불편해서... 이 방식으로 앞으로 진행하려고 합니다.
1-1. github 레포 가져오기
git clone https://github.com/jafingerhut/p4-guide.git
1-2. 환경에 맞는 설치 스크립트 실행
https://github.com/jafingerhut/p4-guide/blob/master/bin/README-install-troubleshooting.md 에 설명히 자세히 되어있습니다. 나의 Linux 환경에 따라서 어떤 스크립트를 실행해야 하는지 정리가 되어있습니다. 자세한 내용은 위 문서를 참고해주세요.
저는 Ubuntu 22.04를 사용중이고 그에 따라 install-p4dev-v6.sh를 설치하였습니다.
cd p4-guide
cd bin
./install-p4dev-v6.sh
필요한 패키지 (protobuf, grpc, PI, behavioral-model, p4c, mininet, ptf, ...)를 모두 설치합니다. 약 2시간 소요됩니다.
1-3. 튜토리얼 실행
이제 튜토리얼 폴더로 이동해서 잘 실행되는지 테스트해봅니다. p4-tutorial 레포 (https://github.com/p4lang/tutorials/) 를 복사해서 해도 되고, p4dev를 설치하면서 함께 다운로드 된 tutorials 폴더를 사용해도 됩니다. (같습니다.)
cd tutorials/exercise/basic
make run
basic에 있는 기본 환경을 테스트해봅니다.
root@bklee:/home/bklee/p4/tutorials/exercises/basic# make run
mkdir -p build pcaps logs
p4c-bm2-ss --p4v 16 --p4runtime-files build/basic.p4.p4info.txt -o build/basic.json basic.p4
basic.p4(81): [--Wwarn=unused] warning: 'dstAddr' is unused
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
^^^^^^^
basic.p4(81): [--Wwarn=unused] warning: 'port' is unused
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
^^^^
[--Wwarn=deprecated] warning: .txt format is being deprecated; use .txtpb instead
basic.p4(81): [--Wwarn=unused] warning: Unused action parameter dstAddr
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
^^^^^^^
basic.p4(81): [--Wwarn=unused] warning: Unused action parameter port
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
^^^^
sudo python3 ../../utils/run_exercise.py -t pod-topo/topology.json -j build/basic.json -b simple_switch_grpc
Reading topology file.
Building mininet topology.
simple_switch_grpc -i 1@s1-eth1 -i 2@s1-eth2 -i 3@s1-eth3 -i 4@s1-eth4 --pcap /home/bklee/p4/tutorials/exercises/basic/pcaps --nanolog ipc:///tmp/bm-0-log.ipc --device-id 0 build/basic.json --log-console --thrift-port 9090 -- --grpc-server-addr 0.0.0.0:50051
simple_switch_grpc -i 1@s2-eth1 -i 2@s2-eth2 -i 4@s2-eth4 -i 3@s2-eth3 --pcap /home/bklee/p4/tutorials/exercises/basic/pcaps --nanolog ipc:///tmp/bm-1-log.ipc --device-id 1 build/basic.json --log-console --thrift-port 9091 -- --grpc-server-addr 0.0.0.0:50052
simple_switch_grpc -i 1@s3-eth1 -i 2@s3-eth2 --pcap /home/bklee/p4/tutorials/exercises/basic/pcaps --nanolog ipc:///tmp/bm-2-log.ipc --device-id 2 build/basic.json --log-console --thrift-port 9092 -- --grpc-server-addr 0.0.0.0:50053
simple_switch_grpc -i 2@s4-eth2 -i 1@s4-eth1 --pcap /home/bklee/p4/tutorials/exercises/basic/pcaps --nanolog ipc:///tmp/bm-3-log.ipc --device-id 3 build/basic.json --log-console --thrift-port 9093 -- --grpc-server-addr 0.0.0.0:50054
뭔가 좌라락 뜨면서 mininet이 시작됩니다. 현재 network topology는 다음과 같습니다.
Configuring switch s1 using P4Runtime with file pod-topo/s1-runtime.json
- Using P4Info file build/basic.p4.p4info.txt...
- Connecting to P4Runtime server on 127.0.0.1:50051 (bmv2)...
- Setting pipeline config (build/basic.json)...
- Inserting 5 table entries...
- MyIngress.ipv4_lpm: (default action) => MyIngress.drop()
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.1.1', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:01:11, port=1)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.2.2', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:02:22, port=2)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.3.3', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:03:00, port=3)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.4.4', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:04:00, port=4)
Configuring switch s2 using P4Runtime with file pod-topo/s2-runtime.json
- Using P4Info file build/basic.p4.p4info.txt...
- Connecting to P4Runtime server on 127.0.0.1:50052 (bmv2)...
- Setting pipeline config (build/basic.json)...
- Inserting 5 table entries...
- MyIngress.ipv4_lpm: (default action) => MyIngress.drop()
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.1.1', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:03:00, port=4)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.2.2', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:04:00, port=3)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.3.3', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:03:33, port=1)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.4.4', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:04:44, port=2)
Configuring switch s3 using P4Runtime with file pod-topo/s3-runtime.json
- Using P4Info file build/basic.p4.p4info.txt...
- Connecting to P4Runtime server on 127.0.0.1:50053 (bmv2)...
- Setting pipeline config (build/basic.json)...
- Inserting 5 table entries...
- MyIngress.ipv4_lpm: (default action) => MyIngress.drop()
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.1.1', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:01:00, port=1)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.2.2', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:01:00, port=1)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.3.3', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:02:00, port=2)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.4.4', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:02:00, port=2)
Configuring switch s4 using P4Runtime with file pod-topo/s4-runtime.json
- Using P4Info file build/basic.p4.p4info.txt...
- Connecting to P4Runtime server on 127.0.0.1:50054 (bmv2)...
- Setting pipeline config (build/basic.json)...
- Inserting 5 table entries...
- MyIngress.ipv4_lpm: (default action) => MyIngress.drop()
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.1.1', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:01:00, port=2)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.2.2', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:01:00, port=2)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.3.3', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:02:00, port=1)
- MyIngress.ipv4_lpm: hdr.ipv4.dstAddr=['10.0.4.4', 32] => MyIngress.ipv4_forward(dstAddr=08:00:00:00:02:00, port=1)
s1 -> gRPC port: 50051
s2 -> gRPC port: 50052
s3 -> gRPC port: 50053
s4 -> gRPC port: 50054
**********
h1
default interface: eth0 10.0.1.1 08:00:00:00:01:11
**********
**********
h2
default interface: eth0 10.0.2.2 08:00:00:00:02:22
**********
**********
h3
default interface: eth0 10.0.3.3 08:00:00:00:03:33
**********
**********
h4
default interface: eth0 10.0.4.4 08:00:00:00:04:44
**********
Starting mininet CLI
1-4. ping test
mininet> h1 ping h2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
^C
--- 10.0.2.2 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2041ms
ping을 테스트해봅니다. 현재는 switch가 모든 packet을 drop하도록 구성되어 있어서 통신이 불가합니다.
끝!
2. P4 dev tool이 설치된 VM까지 한 번에 받기
주의사항
- GUI Mode에서만 가능 - VNC로 진행 (XRDP도 안됐다.)
- virutalbox can't operate in vmx rot mode: 다른 vm이 돌고있지 않은지 확인
2-1. vagrant, virtual box 다운로드
apt install vagrant virtualbox
2-2. repository 다운로드
mkdir p4
cd p4
git clone https://github.com/p4lang/tutorials.git
2-3. vm 시작
cd tutorials/vm-ubuntu-20.04
vagrant up
약 수십분 정도 소요됩니다.
2-4. VM booting 확인
p4 계정에 비밀번호 p4를 입력합니다.
P4 tutorial에서 제공하는 P4 virtualbox로 진입한 것을 확인할 수 있습니다~
2-5. make run test
VM에서 terminal을 열고 tutorials/exercises/basic으로 이동합니다. 그리고 make run을 입력하면 mininet이 실행됩니다.
h1 ping h2를 입력해봅니다.
ping 중단은 ctrl C를 입력하면 됩니다.
이제 다음포스트에서는 P4 tutorial들을 하나씩 살펴보고 코딩을 해보도록 하겠습니다.
'프로그래밍 (Programming) > P4' 카테고리의 다른 글
5. P4 - ecn (0) | 2024.06.29 |
---|---|
4. P4 - P4runtime (0) | 2024.06.25 |
3. P4 - calc (0) | 2024.06.21 |
2. P4 - basic_tunnel (0) | 2024.06.19 |
1. P4 - Basic (0) | 2024.06.17 |