1*5cb53743SAlice Mikityanska#!/usr/bin/env bash 2*5cb53743SAlice Mikityanska# SPDX-License-Identifier: GPL-2.0 3*5cb53743SAlice Mikityanska# 4*5cb53743SAlice Mikityanska# Testing for IPv4 and IPv6 BIG TCP over VXLAN and GENEVE tunnels. 5*5cb53743SAlice Mikityanska 6*5cb53743SAlice MikityanskaSERVER_NS=$(mktemp -u server-XXXXXXXX) 7*5cb53743SAlice MikityanskaSERVER_IP4="192.168.1.1" 8*5cb53743SAlice MikityanskaSERVER_IP6="2001:db8::1:1" 9*5cb53743SAlice MikityanskaSERVER_IP4_TUN="192.168.2.1" 10*5cb53743SAlice MikityanskaSERVER_IP6_TUN="2001:db8::2:1" 11*5cb53743SAlice Mikityanska 12*5cb53743SAlice MikityanskaCLIENT_NS=$(mktemp -u client-XXXXXXXX) 13*5cb53743SAlice MikityanskaCLIENT_IP4="192.168.1.2" 14*5cb53743SAlice MikityanskaCLIENT_IP6="2001:db8::1:2" 15*5cb53743SAlice MikityanskaCLIENT_IP4_TUN="192.168.2.2" 16*5cb53743SAlice MikityanskaCLIENT_IP6_TUN="2001:db8::2:2" 17*5cb53743SAlice Mikityanska 18*5cb53743SAlice Mikityanska: "${PACKETS_THRESHOLD:=1000}" 19*5cb53743SAlice Mikityanska 20*5cb53743SAlice Mikityanska# Kselftest framework requirement - SKIP code is 4. 21*5cb53743SAlice Mikityanskaksft_skip=4 22*5cb53743SAlice Mikityanska 23*5cb53743SAlice Mikityanskasetup() { 24*5cb53743SAlice Mikityanska ip netns add "$SERVER_NS" 25*5cb53743SAlice Mikityanska ip netns add "$CLIENT_NS" 26*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" link add link1 type veth peer name link0 netns "$CLIENT_NS" 27*5cb53743SAlice Mikityanska 28*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" link set link0 up 29*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP4/24" dev link0 30*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP6/112" dev link0 nodad 31*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" link set link0 \ 32*5cb53743SAlice Mikityanska gso_max_size 196608 gso_ipv4_max_size 196608 \ 33*5cb53743SAlice Mikityanska gro_max_size 196608 gro_ipv4_max_size 196608 34*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" link set link1 up 35*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" addr replace "$SERVER_IP4/24" dev link1 36*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" addr replace "$SERVER_IP6/112" dev link1 nodad 37*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" link set link1 \ 38*5cb53743SAlice Mikityanska gso_max_size 196608 gso_ipv4_max_size 196608 \ 39*5cb53743SAlice Mikityanska gro_max_size 196608 gro_ipv4_max_size 196608 40*5cb53743SAlice Mikityanska 41*5cb53743SAlice Mikityanska ip netns exec "$SERVER_NS" netserver >/dev/null 42*5cb53743SAlice Mikityanska} 43*5cb53743SAlice Mikityanska 44*5cb53743SAlice Mikityanskasetup_tunnel() { 45*5cb53743SAlice Mikityanska if [ "$2" = 4 ]; then 46*5cb53743SAlice Mikityanska SERVER_IP="$SERVER_IP4" 47*5cb53743SAlice Mikityanska CLIENT_IP="$CLIENT_IP4" 48*5cb53743SAlice Mikityanska echo "Setting up ${1^^} over IPv4, veth tx csum offload $3" 49*5cb53743SAlice Mikityanska else 50*5cb53743SAlice Mikityanska SERVER_IP="$SERVER_IP6" 51*5cb53743SAlice Mikityanska CLIENT_IP="$CLIENT_IP6" 52*5cb53743SAlice Mikityanska echo "Setting up ${1^^} over IPv6, veth tx csum offload $3" 53*5cb53743SAlice Mikityanska fi 54*5cb53743SAlice Mikityanska 55*5cb53743SAlice Mikityanska if [ "$1" = vxlan ]; then 56*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" link add tun0 type vxlan \ 57*5cb53743SAlice Mikityanska id 5001 remote "$SERVER_IP" local "$CLIENT_IP" dev link0 dstport 4789 58*5cb53743SAlice Mikityanska else 59*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" link add tun0 type geneve \ 60*5cb53743SAlice Mikityanska id 5001 remote "$SERVER_IP" 61*5cb53743SAlice Mikityanska fi 62*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" link set tun0 up 63*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP4_TUN/24" dev tun0 64*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP6_TUN/112" dev tun0 nodad 65*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" link set tun0 \ 66*5cb53743SAlice Mikityanska gso_max_size 196608 gso_ipv4_max_size 196608 \ 67*5cb53743SAlice Mikityanska gro_max_size 196608 gro_ipv4_max_size 196608 68*5cb53743SAlice Mikityanska if [ "$1" = vxlan ]; then 69*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" link add tun1 type vxlan \ 70*5cb53743SAlice Mikityanska id 5001 remote "$CLIENT_IP" local "$SERVER_IP" dev link1 dstport 4789 71*5cb53743SAlice Mikityanska else 72*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" link add tun1 type geneve \ 73*5cb53743SAlice Mikityanska id 5001 remote "$CLIENT_IP" 74*5cb53743SAlice Mikityanska fi 75*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" link set tun1 up 76*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" addr replace "$SERVER_IP4_TUN/24" dev tun1 77*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" addr replace "$SERVER_IP6_TUN/112" dev tun1 nodad 78*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" link set tun1 \ 79*5cb53743SAlice Mikityanska gso_max_size 196608 gso_ipv4_max_size 196608 \ 80*5cb53743SAlice Mikityanska gro_max_size 196608 gro_ipv4_max_size 196608 81*5cb53743SAlice Mikityanska 82*5cb53743SAlice Mikityanska ip netns exec "$CLIENT_NS" ethtool -K link0 tx-checksumming "$3" > /dev/null 83*5cb53743SAlice Mikityanska ip netns exec "$SERVER_NS" ethtool -K link1 tx-checksumming "$3" > /dev/null 84*5cb53743SAlice Mikityanska} 85*5cb53743SAlice Mikityanska 86*5cb53743SAlice Mikityanskacleanup_tunnel() { 87*5cb53743SAlice Mikityanska ip -netns "$CLIENT_NS" link del tun0 88*5cb53743SAlice Mikityanska ip -netns "$SERVER_NS" link del tun1 89*5cb53743SAlice Mikityanska} 90*5cb53743SAlice Mikityanska 91*5cb53743SAlice Mikityanskacleanup() { 92*5cb53743SAlice Mikityanska ip netns pids "$SERVER_NS" | xargs -r kill 93*5cb53743SAlice Mikityanska ip netns pids "$CLIENT_NS" | xargs -r kill 94*5cb53743SAlice Mikityanska ip netns del "$SERVER_NS" 95*5cb53743SAlice Mikityanska ip netns del "$CLIENT_NS" 96*5cb53743SAlice Mikityanska rm -rf "$WORKDIR" 97*5cb53743SAlice Mikityanska} 98*5cb53743SAlice Mikityanska 99*5cb53743SAlice Mikityanskado_test() { 100*5cb53743SAlice Mikityanska # When tx csum offload is off, software GSO is performed before passing the 101*5cb53743SAlice Mikityanska # packet to veth. Check BIG TCP packets inside the VXLAN tunnel to verify 102*5cb53743SAlice Mikityanska # the software checksum path: if the checksum code is broken, these packets 103*5cb53743SAlice Mikityanska # will be dropped. 104*5cb53743SAlice Mikityanska if [ "$3" = on ]; then 105*5cb53743SAlice Mikityanska CAPTURE_IFACE='link' 106*5cb53743SAlice Mikityanska if [ "$1" = 4 ]; then 107*5cb53743SAlice Mikityanska IPTABLES=iptables 108*5cb53743SAlice Mikityanska else 109*5cb53743SAlice Mikityanska IPTABLES=ip6tables 110*5cb53743SAlice Mikityanska fi 111*5cb53743SAlice Mikityanska else 112*5cb53743SAlice Mikityanska CAPTURE_IFACE='tun' 113*5cb53743SAlice Mikityanska if [ "$2" = 4 ]; then 114*5cb53743SAlice Mikityanska IPTABLES=iptables 115*5cb53743SAlice Mikityanska else 116*5cb53743SAlice Mikityanska IPTABLES=ip6tables 117*5cb53743SAlice Mikityanska fi 118*5cb53743SAlice Mikityanska fi 119*5cb53743SAlice Mikityanska if [ "$2" = 4 ]; then 120*5cb53743SAlice Mikityanska IPTABLES_SACK=iptables 121*5cb53743SAlice Mikityanska else 122*5cb53743SAlice Mikityanska IPTABLES_SACK=ip6tables 123*5cb53743SAlice Mikityanska fi 124*5cb53743SAlice Mikityanska 125*5cb53743SAlice Mikityanska ip netns exec "$SERVER_NS" "$IPTABLES" -w -t raw -I PREROUTING -i "${CAPTURE_IFACE}1" -m length ! --length 0:65535 -m comment --comment "bigtcp" 126*5cb53743SAlice Mikityanska ip netns exec "$CLIENT_NS" "$IPTABLES" -w -t raw -I OUTPUT -o "${CAPTURE_IFACE}0" -m length ! --length 0:65535 -m comment --comment "bigtcp" 127*5cb53743SAlice Mikityanska ip netns exec "$SERVER_NS" "$IPTABLES_SACK" -w -t raw -I OUTPUT -o "tun1" -p tcp -m tcp --tcp-flags ACK ACK --tcp-option 5 -m comment --comment "sack" 128*5cb53743SAlice Mikityanska 129*5cb53743SAlice Mikityanska if [ "$2" = 4 ]; then 130*5cb53743SAlice Mikityanska SERVER_IP="$SERVER_IP4_TUN" 131*5cb53743SAlice Mikityanska echo "Running IPv4 traffic in the tunnel" 132*5cb53743SAlice Mikityanska else 133*5cb53743SAlice Mikityanska SERVER_IP="$SERVER_IP6_TUN" 134*5cb53743SAlice Mikityanska echo "Running IPv6 traffic in the tunnel" 135*5cb53743SAlice Mikityanska fi 136*5cb53743SAlice Mikityanska 137*5cb53743SAlice Mikityanska ip netns exec "$CLIENT_NS" netperf -t TCP_STREAM -l 5 -H "$SERVER_IP" -- \ 138*5cb53743SAlice Mikityanska -m 80000 > /dev/null 139*5cb53743SAlice Mikityanska 140*5cb53743SAlice Mikityanska PACKETS_SERVER=$(ip netns exec "$SERVER_NS" "$IPTABLES-save" -c -t raw | sed -rn '/ --comment bigtcp/{s/^\[([0-9]+):.*/\1/p;q}') 141*5cb53743SAlice Mikityanska PACKETS_CLIENT=$(ip netns exec "$CLIENT_NS" "$IPTABLES-save" -c -t raw | sed -rn '/ --comment bigtcp/{s/^\[([0-9]+):.*/\1/p;q}') 142*5cb53743SAlice Mikityanska PACKETS_SACK=$(ip netns exec "$SERVER_NS" "$IPTABLES_SACK-save" -c -t raw | sed -rn '/ --comment sack/{s/^\[([0-9]+):.*/\1/p;q}') 143*5cb53743SAlice Mikityanska ip netns exec "$SERVER_NS" "$IPTABLES" -w -t raw -D PREROUTING -i "${CAPTURE_IFACE}1" -m length ! --length 0:65535 -m comment --comment "bigtcp" 144*5cb53743SAlice Mikityanska ip netns exec "$CLIENT_NS" "$IPTABLES" -w -t raw -D OUTPUT -o "${CAPTURE_IFACE}0" -m length ! --length 0:65535 -m comment --comment "bigtcp" 145*5cb53743SAlice Mikityanska ip netns exec "$SERVER_NS" "$IPTABLES_SACK" -w -t raw -D OUTPUT -o "tun1" -p tcp -m tcp --tcp-flags ACK ACK --tcp-option 5 -m comment --comment "sack" 146*5cb53743SAlice Mikityanska 147*5cb53743SAlice Mikityanska echo "Captured BIG TCP RX packets: $PACKETS_SERVER" 148*5cb53743SAlice Mikityanska echo "Captured BIG TCP TX packets: $PACKETS_CLIENT" 149*5cb53743SAlice Mikityanska echo "Captured TCP SACK packets: $PACKETS_SACK" 150*5cb53743SAlice Mikityanska [ "$PACKETS_SERVER" -gt "$PACKETS_THRESHOLD" ] || return 1 151*5cb53743SAlice Mikityanska [ "$PACKETS_CLIENT" -gt "$PACKETS_THRESHOLD" ] || return 1 152*5cb53743SAlice Mikityanska [ "$PACKETS_SACK" -lt "$(( PACKETS_CLIENT / 2 ))" ] || return 1 153*5cb53743SAlice Mikityanska} 154*5cb53743SAlice Mikityanska 155*5cb53743SAlice Mikityanskaif ! netperf -V &> /dev/null; then 156*5cb53743SAlice Mikityanska echo "SKIP: Could not run test without netperf tool" 157*5cb53743SAlice Mikityanska exit "$ksft_skip" 158*5cb53743SAlice Mikityanskafi 159*5cb53743SAlice Mikityanska 160*5cb53743SAlice Mikityanskaif ! iptables --version &> /dev/null; then 161*5cb53743SAlice Mikityanska echo "SKIP: Could not run test without iptables tool" 162*5cb53743SAlice Mikityanska exit "$ksft_skip" 163*5cb53743SAlice Mikityanskafi 164*5cb53743SAlice Mikityanska 165*5cb53743SAlice Mikityanskaif ! ethtool --version &> /dev/null; then 166*5cb53743SAlice Mikityanska echo "SKIP: Could not run test without ethtool tool" 167*5cb53743SAlice Mikityanska exit "$ksft_skip" 168*5cb53743SAlice Mikityanskafi 169*5cb53743SAlice Mikityanska 170*5cb53743SAlice Mikityanskaif ! ip link help 2>&1 | grep gso_ipv4_max_size &> /dev/null; then 171*5cb53743SAlice Mikityanska echo "SKIP: Could not run test without gso/gro_ipv4_max_size supported in ip-link" 172*5cb53743SAlice Mikityanska exit "$ksft_skip" 173*5cb53743SAlice Mikityanskafi 174*5cb53743SAlice Mikityanska 175*5cb53743SAlice MikityanskaWORKDIR=$(mktemp -d) 176*5cb53743SAlice Mikityanskatrap cleanup EXIT 177*5cb53743SAlice Mikityanskasetup 178*5cb53743SAlice Mikityanskafor tunnel in vxlan geneve; do 179*5cb53743SAlice Mikityanska for tun_family in 4 6; do 180*5cb53743SAlice Mikityanska for traffic_family in 4 6; do 181*5cb53743SAlice Mikityanska for csum_offload in on off; do 182*5cb53743SAlice Mikityanska setup_tunnel "$tunnel" "$tun_family" "$csum_offload" || exit "$?" 183*5cb53743SAlice Mikityanska do_test "$tun_family" "$traffic_family" "$csum_offload" || exit "$?" 184*5cb53743SAlice Mikityanska cleanup_tunnel 185*5cb53743SAlice Mikityanska done 186*5cb53743SAlice Mikityanska done 187*5cb53743SAlice Mikityanska done 188*5cb53743SAlice Mikityanskadone 189