# VPP Containerlab Docker image ## User Documentation The file `vpp.clab.yml` contains an example topology existing of two VPP instances connected each to one Alpine linux container, in the following topology: ![learn-vpp](learn-vpp.png) This container ships with both Bird2 and FRRouting as controlplane agents. You can deploy: * Bird2: `containerlab deploy --topo vpp-bird.clab.yml`. * FRR: `containerlab deploy --topo vpp-frr.clab.yml`. three relevant files for VPP are included in this repository: 1. `config/vpp*/vppcfg.yaml` configures the dataplane interfaces, including a loopback address. 1. `config/vpp*/bird-local.conf` configures the controlplane to enable BFD and OSPF. 1. `config/vpp*/frr.conf` configures the controlplane to enable BFD and OSPF. Once the lab comes up, you can SSH to the VPP containers (`vpp1` and `vpp2`) which will have your SSH keys installed (if available). Otherwise, you can log in as user `root` using password `vpp`. VPP runs its own network namespace called `dataplane`, which is very similar to SR Linux default `network-instance`. You can join it to take a look: ```bash pim@summer:~/src/vpp-containerlab$ ssh root@vpp1 root@vpp1:~# nsenter --net=/var/run/netns/dataplane root@vpp1:~# ip -br a lo DOWN loop0 UP 10.82.98.0/32 2001:db8:8298::/128 fe80::dcad:ff:fe00:0/64 eth1 UNKNOWN 10.82.98.65/28 2001:db8:8298:101::1/64 fe80::a8c1:abff:fe77:acb9/64 eth2 UNKNOWN 10.82.98.16/31 2001:db8:8298:1::1/64 fe80::a8c1:abff:fef0:7125/64 root@vpp1:~# ping 10.82.98.1 ## The vpp2 IPv4 loopback address PING 10.82.98.1 (10.82.98.1) 56(84) bytes of data. 64 bytes from 10.82.98.1: icmp_seq=1 ttl=64 time=9.53 ms 64 bytes from 10.82.98.1: icmp_seq=2 ttl=64 time=15.9 ms ^C --- 10.82.98.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 9.530/12.735/15.941/3.205 ms ``` The two clients are running a minimalistic Alpine Linux container, which doesn't ship with SSH by default. You can enter the containers as following: ```bash pim@summer:~/src/vpp-containerlab$ docker exec -it client1 sh / # ip addr show dev eth1 531235: eth1@if531234: mtu 9500 qdisc noqueue state UP link/ether 00:c1:ab:00:00:01 brd ff:ff:ff:ff:ff:ff inet 10.82.98.66/28 scope global eth1 valid_lft forever preferred_lft forever inet6 2001:db8:8298:101::2/64 scope global valid_lft forever preferred_lft forever inet6 fe80::2c1:abff:fe00:1/64 scope link valid_lft forever preferred_lft forever / # traceroute 10.82.98.82 traceroute to 10.82.98.82 (10.82.98.82), 30 hops max, 46 byte packets 1 10.82.98.65 (10.82.98.65) 5.906 ms 7.086 ms 7.868 ms 2 10.82.98.17 (10.82.98.17) 24.007 ms 23.349 ms 15.933 ms 3 10.82.98.82 (10.82.98.82) 39.978 ms 31.127 ms 31.854 ms / # traceroute 2001:db8:8298:102::2 traceroute to 2001:db8:8298:102::2 (2001:db8:8298:102::2), 30 hops max, 72 byte packets 1 2001:db8:8298:101::1 (2001:db8:8298:101::1) 0.701 ms 7.144 ms 7.900 ms 2 2001:db8:8298:1::2 (2001:db8:8298:1::2) 23.909 ms 22.943 ms 23.893 ms 3 2001:db8:8298:102::2 (2001:db8:8298:102::2) 31.964 ms 30.814 ms 32.000 ms ``` From the vantage point of `client1`, the first hop represents the `vpp1` node, which forwards to `vpp2`, which finally forwards to `client2`. ## Developer Documentation See [BUILDING.md](BUILDING.md) for instructions on building the image, sideloading locally built VPP packages, multiarch builds, testing, and configuring VPP.