# 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 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 /tmp/pasta.pid sleep 3 nl nl say For convenience, let's enter this namespace nl say from another terminal. sleep 3 nsout TARGET_PID pgrep -P $(cat /tmp/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 __STATEDIR__/demo_pasta.pcap sleep 2 passt passt /sbin/dhclient -4 --no-pid sleep 2 hostb tshark -r __STATEDIR__/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 /tmp/pasta.pid sleep 2 nsout TARGET_PID pgrep -P $(cat /tmp/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 __OPTS__ nsout BW iperf3 -s1J | jq -rM ".end.sum_received.bits_per_second" bw __BW__ 10.0 20.0 sleep 5 nsb sleep 10; iperf3 -c ::1 __OPTS__ hout BW iperf3 -s1J | 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 __OPTS__ nsout BW iperf3 -s1J | 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 __OPTS__ hout BW iperf3 -s1J | 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 ns cd __STATEDIR__/passt 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