Compare commits

...

27 Commits

Author SHA1 Message Date
2b03aad9bc Remove manual-{pre,post}.vpp 2025-05-08 20:56:38 +02:00
17c3977873 Move to Ubuntu Noble, which allows for arm64 images 2025-05-08 18:32:25 +02:00
e5889b22e2 Reduce docker layers, rename the Dockerfile in prep for move to Ubuntu 2025-05-08 18:29:59 +02:00
49b8df9709 Add FRRouting support to VPP Containerlab 2025-05-07 20:31:28 +02:00
dc1840a6ec Drop a hint about --build-arg to set the REPO variant 2025-05-04 20:22:46 +02:00
7114b24331 Move to MTU 9216 2025-05-04 20:13:47 +02:00
4c640d7f10 Move to startup-config and move the binds fields to the fdio_vpp kind 2025-05-04 20:10:56 +02:00
b16599d267 Update vppcfg location to git.ipng.ch, h/t @hellt 2025-05-04 18:59:41 +02:00
88ee8a2ae8 Add pre languages 2025-05-04 12:45:10 +02:00
647030927a Update README to add user guide for a simple containerlab 2025-05-04 12:42:41 +02:00
659ae59a3b Add an example topo 2025-05-04 12:31:46 +02:00
ef79717ebe Add a simple containerlab 2025-05-04 12:24:26 +02:00
1667677f72 Move docker build stuff into a subdirectory. Update structure to retire manual-{pre,post} 2025-05-04 12:19:44 +02:00
f4f38646fd Add mtr and traceroute 2025-05-04 11:03:50 +02:00
47eed50e30 Add bird2 + skeleton config 2025-05-04 10:49:55 +02:00
e0f336df88 Move VPP files into their own subdir 2025-05-04 09:28:45 +02:00
b5e04e427f Move container image to git.ipng.ch 2025-05-04 09:20:15 +02:00
3c64e1392e Update README with current state 2025-05-03 22:24:59 +02:00
a52354d5b2 Sort interfaces to ensure a reliable creation order 2025-05-03 22:06:11 +02:00
1b6e2c4726 Add SSH and create default credentials 'root:vpp' 2025-05-03 21:38:16 +02:00
49b5d58bd6 JIT compile the clab.vpp file based on all veth interfaces except eth0 2025-05-03 20:51:05 +02:00
1c603ab583 Cleanup. Ensure the docker build is un-cached 2025-05-03 15:07:49 +02:00
07fc441234 Add vim 2025-05-03 15:07:31 +02:00
e71451f1c5 Add Linux CP: create 'dataplane' network namespace, move to init-container.sh to do the plumbing 2025-05-03 14:22:43 +02:00
234ff1d1d3 Move files to their own directory 2025-05-03 13:30:04 +02:00
e8331cd3af Add some notes on mechanics and VFIO kernel driver 2025-05-03 11:36:28 +02:00
ff50a5c29b Add a note about VFIO and how to add devices in the containerlab idiom 2025-05-03 11:18:49 +02:00
26 changed files with 524 additions and 49 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
clab-*
**/*.bak

View File

@ -1,20 +0,0 @@
FROM debian:bookworm
ARG DEBIAN_FRONTEND=noninteractive
ARG VPP_INSTALL_SKIP_SYSCTL=true
ARG REPO=release
RUN apt-get update
RUN apt-get -y install curl procps tcpdump iproute2 iptables binutils \
bridge-utils iputils-ping netcat-traditional net-tools nmap \
python3 python3-dev python3-pip
RUN mkdir -p /var/log/vpp
RUN curl -s https://packagecloud.io/install/repositories/fdio/${REPO}/script.deb.sh | bash
RUN apt-get update
RUN apt-get -y install vpp vpp-plugin-core
RUN apt-get -y clean
COPY startup.conf /etc/vpp/startup.conf
COPY bootstrap.vpp /etc/vpp/bootstrap.vpp
COPY manual-pre.vpp /etc/vpp/manual-pre.vpp
COPY clab.vpp /etc/vpp/clab.vpp
COPY manual-post.vpp /etc/vpp/manual-post.vpp
CMD ["/usr/bin/vpp","-c","/etc/vpp/startup.conf"]

172
README.md
View File

@ -1,50 +1,174 @@
# VPP Containerlab Docker image
This docker container creates a VPP instance based on the latest release. It starts up as per
normal, using /etc/vpp/startup.conf (which Containerlab will replace), and once started, it'll
execute /etc/vpp/bootstrap.vpp within the dataplane. There are three relevant files:
## User Documentation
1. `manual-pre.vpp` -- can be supplied by the user, to run any configuration statements before
containerlab takes control.
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:
1. `clab.vpp` -- generated by containerlab. Its purpose is to bind the `vethpair` interfaces
into theo dataplane (see below).
![learn-vpp](learn-vpp.png)
1. `manual-post.vpp` -- can be supplied by the user, to run any configuration statements after
containerlab is finished with its per-lab statements.
This container ships with both Bird2 and FRRouting as controlplane agents.
## Building
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
docker build -f Dockerfile.bookworm . -t pimvanpelt/vpp-containerlab
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
```
## Starting the container
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: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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
```
docker network create --driver=bridge network2 --subnet=172.19.1.0/24
From the vantage point of `client1`, the first hop represents the `vpp1` node, which forwards to
`vpp2`, which finally forwards to `client2`.
## Developer Documentation
This docker container creates a VPP instance based on the latest VPP release. It starts up as per
normal, using /etc/vpp/startup.conf (which Containerlab might replace when it starts its
containers). Once started, it'll execute `/etc/vpp/bootstrap.vpp` within the dataplane. There are
two relevant files:
1. `clab.vpp` -- generated by `files/init-container.sh`. Its purpose is to bind the `veth`
interfaces that containerlab has added to the container into the VPP dataplane (see below).
1. `vppcfg.vpp` -- generated by `files/init-container.sh`. Its purpose is to read the user
specified `vppcfg.yaml` file and convert it into VPP CLI commands. If no YAML file is
specified, or if it is not syntactically valid, an empty file is generated instead.
For Containerlab users who wish to have more control over their VPP bootstrap, it's possible to
bind-mount `/etc/vpp/bootstrap.vpp`.
### Building
```bash
IMG=git.ipng.ch/ipng/vpp-containerlab
TAG=latest
docker build --no-cache --build-arg REPO=release -f docker/Dockerfile -t $IMG docker/
docker image tag $IMG $IMG:$TAG
docker push $IMG
docker push $IMG:$TAG
```
### Testing standalone container
```bash
docker network create --driver=bridge clab-network --subnet=192.0.2.0/24 \
--ipv6 --subnet=2001:db8::/64
docker rm clab-pim
docker run --cap-add=NET_ADMIN --cap-add=SYS_NICE --cap-add=SYS_PTRACE \
--device=/dev/net/tun:/dev/net/tun --device=/dev/vfio/vfio:/dev/vfio/vfio \
--device=/dev/net/tun:/dev/net/tun \
--device=/dev/vhost-net:/dev/vhost-net \
--privileged=True --name clab-pim \
docker.io/pimvanpelt/vpp-containerlab
docker network connect network2 clab-pim
--privileged --name clab-pim \
git.ipng.ch/ipng/vpp-containerlab:latest
docker network connect clab-network clab-pim
```
## Configuring VPP
#### A note on DPDK
DPDK will be disabled by default as it requires hugepages and VFIO and/or UIO to use physical
network cards. If DPDK at some future point is desired, mapping VFIO can be done by adding this:
```
--device=/dev/vfio/vfio:/dev/vfio/vfio
```
or in Containerlab, using the `devices` feature:
```yaml
my-node:
image: git.ipng.ch/ipng/vpp-containerlab:latest
kind: fdio_vpp
devices:
- /dev/vfio/vfio
- /dev/net/tun
- /dev/vhost-net
```
If using DPDK in a container, one of the userspace IO kernel drivers must be loaded in the host
kernel. Options are `igb_uio`, `vfio_pci`, or `uio_pci_generic`:
```bash
$ sudo modprobe igb_uio
$ sudo modprobe vfio_pci
$ sudo modprobe uio_pci_generic
```
Particularly the VFIO driver needs to be present before one can attempt to bindmount
`/dev/vfio/vfio` into the container!
### Configuring VPP
When Containerlab starts the docker containers, it'll offer one or more `veth` point to point
network links, which will show up as `eth1` and further. `eth0` is the default NIC that belongs to
the management plane in Containerlab (the one which you'll see with `containerlab inspect`). Before
VPP can use these `veth` interfaces, it needs to bind them, like so:
```bash
docker exec -it clab-pim vppctl
```
and then within the VPP control shell:
```
vpp-clab# create host-interface v2 name eth1
vpp-clab# set interface name host-eth1 eth1
vpp-clab# set interface mtu 1500 eth1
vpp-clab# set interface ip address eth1 172.19.1.2/24
vpp-clab# set interface ip address eth1 fec0::2/64
vpp-clab# set interface state eth1 up
create host-interface v2 name eth1
set interface name host-eth1 eth1
set interface mtu 1500 eth1
set interface ip address eth1 192.0.2.2/24
set interface ip address eth1 2001:db8::2/64
set interface state eth1 up
```
Containerlab will attach these `veth` pairs to the container, and replace our Docker CMD with one
that waits for all of these interfaces to be added (typically called `if-wait.sh`). In our own CMD,
we then generate a config file called `/etc/vpp/clab.vpp` which contains the necessary VPP commands
to take control over these `veth` pairs.

View File

@ -1,3 +0,0 @@
exec /etc/vpp/manual-pre.vpp
exec /etc/vpp/clab.vpp
exec /etc/vpp/manual-post.vpp

2
config/lab-frr.env Normal file
View File

@ -0,0 +1,2 @@
BIRD_ENABLED=false
FRR_ENABLED=true

View File

@ -0,0 +1,19 @@
protocol bfd bfd1 {
interface "eth2" { interval 100 ms; multiplier 30; };
}
protocol ospf v2 ospf4 {
ipv4 { import all; export all; };
area 0 {
interface "loop0" { stub yes; };
interface "eth2" { type pointopoint; cost 10; bfd on; };
};
}
protocol ospf v3 ospf6 {
ipv6 { import all; export all; };
area 0 {
interface "loop0" { stub yes; };
interface "eth2" { type pointopoint; cost 10; bfd on; };
};
}

34
config/vpp1/frr.conf Normal file
View File

@ -0,0 +1,34 @@
frr version 10.3
frr defaults traditional
hostname vpp1
log syslog informational
service integrated-vtysh-config
!
ip router-id 10.82.98.0
!
interface eth2
ip ospf bfd
ip ospf cost 10
ip ospf network point-to-point
ipv6 ospf6 area 0
ipv6 ospf6 bfd
ipv6 ospf6 cost 10
ipv6 ospf6 network point-to-point
exit
!
interface loop0
ip ospf passive
exit
!
router ospf
redistribute connected
network 10.82.98.0/24 area 0
exit
!
router ospf6
redistribute connected
exit
!
bfd
exit
!

16
config/vpp1/vppcfg.yaml Normal file
View File

@ -0,0 +1,16 @@
interfaces:
eth1:
description: 'To client1'
mtu: 1500
lcp: eth1
addresses: [ 10.82.98.65/28, 2001:db8:8298:101::1/64 ]
eth2:
description: 'To vpp2'
mtu: 9216
lcp: eth2
addresses: [ 10.82.98.16/31, 2001:db8:8298:1::1/64 ]
loopbacks:
loop0:
description: 'vpp1'
lcp: loop0
addresses: [ 10.82.98.0/32, 2001:db8:8298::/128 ]

View File

@ -0,0 +1,19 @@
protocol bfd bfd1 {
interface "eth2" { interval 100 ms; multiplier 30; };
}
protocol ospf v2 ospf4 {
ipv4 { import all; export all; };
area 0 {
interface "loop0" { stub yes; };
interface "eth2" { type pointopoint; cost 10; bfd on; };
};
}
protocol ospf v3 ospf6 {
ipv6 { import all; export all; };
area 0 {
interface "loop0" { stub yes; };
interface "eth2" { type pointopoint; cost 10; bfd on; };
};
}

31
config/vpp2/frr.conf Normal file
View File

@ -0,0 +1,31 @@
frr version 10.3
frr defaults traditional
hostname vpp2
log syslog informational
service integrated-vtysh-config
!
ip router-id 10.82.98.1
!
interface eth2
ip ospf bfd
ip ospf cost 10
ip ospf network point-to-point
ipv6 ospf6 area 0
ipv6 ospf6 bfd
ipv6 ospf6 cost 10
ipv6 ospf6 network point-to-point
exit
!
interface loop0
ip ospf passive
exit
!
router ospf
redistribute connected
network 10.82.98.0/24 area 0
exit
!
router ospf6
redistribute connected
exit
!

16
config/vpp2/vppcfg.yaml Normal file
View File

@ -0,0 +1,16 @@
interfaces:
eth1:
description: 'To client2'
mtu: 1500
lcp: eth1
addresses: [ 10.82.98.81/28, 2001:db8:8298:102::1/64 ]
eth2:
description: 'To vpp1'
mtu: 9216
lcp: eth2
addresses: [ 10.82.98.17/31, 2001:db8:8298:1::2/64 ]
loopbacks:
loop0:
description: 'vpp2'
lcp: loop0
addresses: [ 10.82.98.1/32, 2001:db8:8298::1/128 ]

30
docker/Dockerfile Normal file
View File

@ -0,0 +1,30 @@
FROM ubuntu:noble
ARG DEBIAN_FRONTEND=noninteractive
ARG VPP_INSTALL_SKIP_SYSCTL=true
ARG REPO=release
EXPOSE 22/tcp
RUN apt-get update && apt-get -y install curl procps tcpdump iproute2 iptables \
iputils-ping net-tools git python3 python3-pip vim-tiny openssh-server bird2 \
mtr-tiny traceroute && apt-get clean
# Install VPP
RUN mkdir -p /var/log/vpp /root/.ssh/ && \
curl -s https://packagecloud.io/install/repositories/fdio/${REPO}/script.deb.sh | bash && \
apt-get -y install vpp vpp-plugin-core && apt-get clean
# Build vppcfg
RUN pip install --break-system-packages build netaddr yamale argparse pyyaml ipaddress && \
git clone https://git.ipng.ch/ipng/vppcfg.git && cd vppcfg && python3 -m build && \
pip install --break-system-packages dist/vppcfg-*-py3-none-any.whl
# Install FRR
RUN curl -s -o /usr/share/keyrings/frrouting.gpg https://deb.frrouting.org/frr/keys.gpg && \
echo deb '[signed-by=/usr/share/keyrings/frrouting.gpg]' https://deb.frrouting.org/frr bookworm frr-stable \
> /etc/apt/sources.list.d/frr.list && \
apt -y update && apt -y install frr frr-pythontools && apt clean
# Config files
COPY files/etc/ /etc/
COPY files/init-container.sh /sbin/
RUN chmod 755 /sbin/init-container.sh
CMD ["/sbin/init-container.sh"]

View File

@ -0,0 +1 @@
# Containerlab user overrides go in this file.

View File

@ -0,0 +1,26 @@
# Bird2 configuration for VPP Containerlab
# router id 192.0.2.0;
timeformat base iso long;
timeformat log iso long;
timeformat protocol iso long;
timeformat route iso long;
log "/var/log/bird/bird.log" { debug, trace, info, remote, warning, error, auth, fatal, bug };
protocol device { scan time 30; }
protocol direct { ipv4; ipv6; check link yes; }
protocol kernel kernel4 {
ipv4 { import none; export where source != RTS_DEVICE; };
learn off; scan time 300;
}
protocol kernel kernel6 {
ipv6 { import none; export where source != RTS_DEVICE; };
learn off; scan time 300;
}
include "bird-local.conf";

View File

@ -0,0 +1,17 @@
# These are the daemons that FRR will use for VPP Containerlab
# NOTE: we need to run in the 'dataplane' network namespace, and use the `dplane_fpm_nl` plugin
bgpd=yes
ospfd=yes
ospf6d=yes
bfdd=yes
ldpd=yes
vtysh_enable=yes
watchfrr_options="--netns=dataplane"
zebra_options=" -A 127.0.0.1 -s 67108864 -M dplane_fpm_nl"
bgpd_options=" -A 127.0.0.1"
ospfd_options=" -A 127.0.0.1"
ospf6d_options=" -A ::1"
staticd_options="-A 127.0.0.1"
bfdd_options=" -A 127.0.0.1"
ldpd_options=" -A 127.0.0.1"

View File

@ -0,0 +1,10 @@
# This is the VPP Containerlab default FRR configuration.
frr defaults traditional
log syslog informational
ip forwarding
ipv6 forwarding
service integrated-vtysh-config
!
ip router-id 192.0.2.1
!

View File

@ -0,0 +1,2 @@
exec /etc/vpp/clab.vpp
exec /etc/vpp/vppcfg.vpp

View File

@ -1,3 +1,6 @@
# This is the vpp-containerlab default startup.conf, which is meant to be
# overridden by Containerlab's node/fdio_vpp/vpp_startup_config.go.tpl
unix {
interactive
log /var/log/vpp/vpp.log
@ -37,3 +40,11 @@ plugins {
plugin linux_nl_plugin.so { enable }
plugin sflow_plugin.so { enable }
}
linux-cp {
default netns dataplane
lcp-sync
lcp-auto-subint
del-static-on-link-down
del-dynamic-on-link-down
}

59
docker/files/init-container.sh Executable file
View File

@ -0,0 +1,59 @@
#!/usr/bin/env bash
STARTUP_CONFIG=${STARTUP_CONFIG:="/etc/vpp/startup.conf"}
CLAB_VPP_FILE=${CLAB_VPP_FILE:=/etc/vpp/clab.vpp}
VPPCFG_VPP_FILE=${VPPCFG_VPP_FILE:=/etc/vpp/vppcfg.vpp}
NETNS=${NETNS:="dataplane"}
BIRD_ENABLED=${BIRD_ENABLED:="true"}
FRR_ENABLED=${FRR_ENABLED:="false"}
echo "Creating dataplane namespace"
/usr/bin/mkdir -p /etc/netns/$NETNS
/usr/bin/touch /etc/netns/$NETNS/resolv.conf
/usr/sbin/ip netns add $NETNS
echo "Starting SSH, with credentials root:vpp"
sed -i -e 's,^#PermitRootLogin prohibit-password,PermitRootLogin yes,' /etc/ssh/sshd_config
sed -i -e 's,^root:.*,root:$y$j9T$kG8pyZEVmwLXEtXekQCRK.$9iJxq/bEx5buni1hrC8VmvkDHRy7ZMsw9wYvwrzexID:20211::::::,' /etc/shadow
/etc/init.d/ssh start
if [ "$BIRD_ENABLED" == "true" ]; then
echo "Starting Bird in $NETNS"
mkdir -p /run/bird /var/log/bird
chown bird:bird /var/log/bird
ROUTERID=$(ip -br a show eth0 | awk '{ print $3 }' | cut -f1 -d/)
sed -i -e "s,.*router id .*,router id $ROUTERID; # Set by container-init.sh," /etc/bird/bird.conf
/usr/bin/nsenter --net=/var/run/netns/$NETNS /usr/sbin/bird -u bird -g bird
fi
if [ "$FRR_ENABLED" == "true" ]; then
echo "Starting FRRouting in $NETNS"
ROUTERID=$(ip -br a show eth0 | awk '{ print $3 }' | cut -f1 -d/)
sed -i -e "s,^ip router-id .*,ip router-id $ROUTERID," /etc/frr/frr.conf
/etc/init.d/frr start
fi
echo "Generating $CLAB_VPP_FILE"
: > $CLAB_VPP_FILE
MTU=9216
for IFNAME in $(ip -br link show type veth | cut -f1 -d@ | grep -v '^eth0$' | sort); do
MAC=$(ip -br link show dev $IFNAME | awk '{ print $3 }')
echo " * $IFNAME hw-addr $MAC mtu $MTU"
ip link set $IFNAME up mtu $MTU
cat << EOF >> $CLAB_VPP_FILE
create host-interface name $IFNAME hw-addr $MAC
set interface name host-$IFNAME $IFNAME
set interface mtu $MTU $IFNAME
set interface state $IFNAME up
EOF
done
echo "Generating $VPPCFG_VPP_FILE"
: > $VPPCFG_VPP_FILE
if [ -r /etc/vpp/vppcfg.yaml ]; then
vppcfg plan --novpp -c /etc/vpp/vppcfg.yaml -o $VPPCFG_VPP_FILE
fi
echo "Starting VPP"
exec /usr/bin/vpp -c $STARTUP_CONFIG

BIN
learn-vpp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -1 +0,0 @@
comment { These commands are executed after Containerlab stuff }

View File

@ -1 +0,0 @@
comment { These commands are executed before Containerlab stuff }

39
vpp-bird.clab.yml Normal file
View File

@ -0,0 +1,39 @@
name: learn-vpp
prefix: ""
topology:
kinds:
fdio_vpp:
image: git.ipng.ch/ipng/vpp-containerlab:latest
startup-config: config/__clabNodeName__/vppcfg.yaml
binds:
- config/__clabNodeName__/bird-local.conf:/etc/bird/bird-local.conf:ro
linux:
image: alpine:latest
nodes:
vpp1:
kind: fdio_vpp
vpp2:
kind: fdio_vpp
client1:
kind: linux
exec:
- ip link set address 00:c1:ab:00:00:01 dev eth1
- ip addr add 10.82.98.66/28 dev eth1
- ip route add 10.82.98.0/24 via 10.82.98.65
- ip addr add 2001:db8:8298:101::2/64 dev eth1
- ip route add 2001:db8:8298::/48 via 2001:db8:8298:101::1
client2:
kind: linux
exec:
- ip link set address 00:c1:ab:00:00:02 dev eth1
- ip addr add 10.82.98.82/28 dev eth1
- ip route add 10.82.98.0/24 via 10.82.98.81
- ip addr add 2001:db8:8298:102::2/64 dev eth1
- ip route add 2001:db8:8298::/48 via 2001:db8:8298:102::1
links:
- endpoints: ["vpp1:eth2", "vpp2:eth2"]
- endpoints: ["client1:eth1", "vpp1:eth1"]
- endpoints: ["client2:eth1", "vpp2:eth1"]

41
vpp-frr.clab.yml Normal file
View File

@ -0,0 +1,41 @@
name: learn-vpp
prefix: ""
topology:
kinds:
fdio_vpp:
image: git.ipng.ch/ipng/vpp-containerlab:latest
startup-config: config/__clabNodeName__/vppcfg.yaml
binds:
- config/__clabNodeName__/frr.conf:/etc/frr/frr.conf
env-files:
- config/lab-frr.env
linux:
image: alpine:latest
nodes:
vpp1:
kind: fdio_vpp
vpp2:
kind: fdio_vpp
client1:
kind: linux
exec:
- ip link set address 00:c1:ab:00:00:01 dev eth1
- ip addr add 10.82.98.66/28 dev eth1
- ip route add 10.82.98.0/24 via 10.82.98.65
- ip addr add 2001:db8:8298:101::2/64 dev eth1
- ip route add 2001:db8:8298::/48 via 2001:db8:8298:101::1
client2:
kind: linux
exec:
- ip link set address 00:c1:ab:00:00:02 dev eth1
- ip addr add 10.82.98.82/28 dev eth1
- ip route add 10.82.98.0/24 via 10.82.98.81
- ip addr add 2001:db8:8298:102::2/64 dev eth1
- ip route add 2001:db8:8298::/48 via 2001:db8:8298:102::1
links:
- endpoints: ["vpp1:eth2", "vpp2:eth2"]
- endpoints: ["client1:eth1", "vpp1:eth1"]
- endpoints: ["client2:eth1", "vpp2:eth1"]

1
vpp.clab.yml Symbolic link
View File

@ -0,0 +1 @@
vpp-bird.clab.yml