Byeo

0. P4 tutorial 환경 구성 본문

프로그래밍 (Programming)/P4

0. P4 tutorial 환경 구성

BKlee 2024. 6. 16. 23:53
반응형

P4 tutorial을 따라해보기 위해서 환경을 구성합니다.

 

P4 tutorial GitHub repository: https://github.com/p4lang/tutorials/

 

GitHub - p4lang/tutorials: P4 language tutorials

P4 language tutorials. Contribute to p4lang/tutorials development by creating an account on GitHub.

github.com

 

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

 

https://github.com/p4lang/tutorials/tree/master/exercises/basic

 

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
Comments