passt/test/demo/pasta
Stefano Brivio b3549093f7 test/demo: Avoid using port 5201 on the host
That's the default port for iperf3, which also means that it's quite
likely in use on my test machine. Use different port numbers: recycle
the scheme we use in tests for passt and pasta's demo, use 5221-5224
(a bit shorter) for the slirp4netns container in Podman's demo.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
2022-09-24 00:07:18 +02:00

274 lines
5 KiB
Text

# SPDX-License-Identifier: AGPL-3.0-or-later
#
# PASST - Plug A Simple Socket Transport
# for qemu/UNIX domain socket mode
#
# PASTA - Pack A Subtle Tap Abstraction
# for network namespace/tap device mode
#
# test/demo/pasta - Quick introduction to pasta
#
# Copyright (c) 2021 Red Hat GmbH
# Author: Stefano Brivio <sbrivio@redhat.com>
say This is a short introduction to
em pasta
say .
nl
nl
sleep 3
say Let's fetch the source
sleep 1
host cd __STATEDIR__
host git clone git://passt.top/passt
sleep 1
say and build it.
sleep 1
host cd passt
host make
sleep 1
nl
nl
say A quick look at the man page...
sleep 1
hostb man ./pasta.1
sleep 5
hostb /pasta
sleep 2
hostb n
sleep 2
hostb n
sleep 10
nl
say without PID, it will create a namespace.
sleep 3
passt cd __STATEDIR__/passt
passtb ./pasta -P pasta.pid
sleep 3
nl
nl
say For convenience, let's enter this namespace
nl
say from another terminal.
sleep 3
ns cd __STATEDIR__/passt
nsout TARGET_PID pgrep -P $(cat pasta.pid)
sleep 1
ns nsenter -t __TARGET_PID__ -U -n --preserve-credentials
sleep 5
nl
nl
say Now, we're ready to configure networking.
sleep 2
host q
nl
nl
ns ip link show
sleep 3
say Let's configure IPv4 first...
sleep 2
ns /sbin/dhclient -4 --no-pid
sleep 2
ns ip addr show
sleep 5
nl
say SLAAC is already done, but we can also
nl
say get another address via DHCPv6.
sleep 3
ns /sbin/dhclient -6 --no-pid
sleep 3
nl
nl
say Let's try to communicate between host and namespace
sleep 2
nl
say ...there's no need to configure port forwarding,
nl
say pasta detects bound ports and forwards them.
sleep 3
nsb socat TCP6-LISTEN:31337,bind=[::1] STDOUT
sleep 2
host echo "Hello from the host" | socat -u STDIN TCP6:[::1]:31337
sleep 5
nl
nl
say Now the other way around...
nl
say we can use a loopback address
sleep 2
hostb socat TCP6-LISTEN:31337,bind=[::1] STDIO
sleep 2
ns echo "Hello from the namespace" | socat -u STDIN TCP6:[::1]:31337
sleep 5
nl
say or the address of the default gateway.
sleep 2
nsout GW ip -j -4 route show|jq -rM '.[] | select(.dst == "default").gateway'
sleep 5
hostb socat TCP4-LISTEN:31337 STDIO
sleep 2
ns echo "Hello from the namespace" | socat -u STDIN TCP4:__GW__:31337
sleep 3
nl
nl
say UDP...
sleep 2
ns host -t A passt.top
sleep 3
say seems to work too.
sleep 3
nl
nl
em pasta
say can also take packet captures.
sleep 3
passt exit
sleep 2
passtb ./pasta -p ../demo_pasta.pcap
sleep 2
passt
passt /sbin/dhclient -4 --no-pid
sleep 2
hostb tshark -r ../demo_pasta.pcap
sleep 5
nl
nl
say And there are tons of totally useless
sleep 1
bsp 14
say absolutely useful features
nl
say you can find described in the man page.
sleep 5
nl
nl
say Let's have a (quick!) look at performance
nl
say more in the "Performance" section below.
sleep 3
ns exit
passt exit
passt make clean
passt CFLAGS="-g" make
sleep 2
passtb perf record -g ./pasta -P pasta.pid
sleep 2
nsout TARGET_PID pgrep -P $(cat pasta.pid)
sleep 1
ns nsenter -t __TARGET_PID__ -U -n --preserve-credentials
sleep 5
nl
nl
info Throughput in Gbps, latency in µs
th flow init>ns ns>init
set OPTS -P4 -l 1M -w 32M -i1 --pacing-timer 100000
tr TCP/IPv6 throughput
hostb sleep 10; iperf3 -c ::1 -p 10001 __OPTS__
nsout BW iperf3 -s1J -p 10001 | jq -rM ".end.sum_received.bits_per_second"
bw __BW__ 10.0 20.0
sleep 5
nsb sleep 10; iperf3 -c ::1 -p 10001 __OPTS__
hout BW iperf3 -s1J -p 10001 | jq -rM ".end.sum_received.bits_per_second"
bw __BW__ 10.0 20.0
tl TCP/IPv6 RR latency
nsb tcp_rr -6 --nolog
sleep 2
hout LAT tcp_rr --nolog -c -H ::1 | sed -n 's/^throughput=\(.*\)/\1/p'
lat __LAT__ 1000 500
sleep 2
hostb tcp_rr -6 --nolog
sleep 2
nsout LAT tcp_rr --nolog -c -H ::1 | sed -n 's/^throughput=\(.*\)/\1/p'
lat __LAT__ 1000 500
sleep 2
tl TCP/IPv6 CRR latency
nsb tcp_crr -6 --nolog
sleep 2
hout LAT tcp_crr --nolog -c -H ::1 | sed -n 's/^throughput=\(.*\)/\1/p'
lat __LAT__ 1000 500
sleep 2
hostb tcp_crr -6 --nolog
sleep 2
nsout LAT tcp_crr --nolog -c -H ::1 | sed -n 's/^throughput=\(.*\)/\1/p'
lat __LAT__ 1000 500
sleep 2
tr TCP/IPv4 throughput
hostb sleep 10; iperf3 -c 127.0.0.1 -p 10001 __OPTS__
nsout BW iperf3 -s1J -p 10001 | jq -rM ".end.sum_received.bits_per_second"
bw __BW__ 10.0 20.0
sleep 5
nsb sleep 10; iperf3 -c 127.0.0.1 -p 10001 __OPTS__
hout BW iperf3 -s1J -p 10001 | jq -rM ".end.sum_received.bits_per_second"
bw __BW__ 10.0 20.0
tl TCP/IPv4 RR latency
nsb tcp_rr -4 --nolog
sleep 2
hout LAT tcp_rr --nolog -c -H 127.0.0.1 | sed -n 's/^throughput=\(.*\)/\1/p'
lat __LAT__ 1000 500
sleep 2
hostb tcp_rr -4 --nolog
sleep 2
nsout LAT tcp_rr --nolog -c -H 127.0.0.1 | sed -n 's/^throughput=\(.*\)/\1/p'
lat __LAT__ 1000 500
sleep 2
tl TCP/IPv4 CRR latency
nsb tcp_crr -4 --nolog
sleep 2
hout LAT tcp_crr --nolog -c -H 127.0.0.1 | sed -n 's/^throughput=\(.*\)/\1/p'
lat __LAT__ 1000 500
sleep 2
hostb tcp_crr -4 --nolog
sleep 2
nsout LAT tcp_crr --nolog -c -H 127.0.0.1 | sed -n 's/^throughput=\(.*\)/\1/p'
lat __LAT__ 1000 500
sleep 2
sleep 5
passt exit
sleep 2
killp PASST
killp HOST
sleep 2
nsb perf report -g --max-stack 3
sleep 10
nl
nl
say I
em knew
say it.
em syscalls
say .
sleep 5
nl
nl
say Thanks for watching!
sleep 5