From nobody Sat Apr 11 02:19:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1CBB5C2BB41 for ; Wed, 17 Aug 2022 07:38:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232180AbiHQHh7 (ORCPT ); Wed, 17 Aug 2022 03:37:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51866 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232214AbiHQHh3 (ORCPT ); Wed, 17 Aug 2022 03:37:29 -0400 Received: from mx07-0057a101.pphosted.com (mx07-0057a101.pphosted.com [205.220.184.10]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CEB8375CF6; Wed, 17 Aug 2022 00:37:25 -0700 (PDT) Received: from pps.filterd (m0214197.ppops.net [127.0.0.1]) by mx07-0057a101.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 27H5Ac33010596; Wed, 17 Aug 2022 09:37:02 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=westermo.com; h=from : to : cc : subject : date : message-id : mime-version : content-type : content-transfer-encoding; s=12052020; bh=JCIXwg2KltuVDsw3bCg0ydI9BX7R71/9nGIwU3MIRGI=; b=BoeTrH5vvMHaptfG3AJudM5bDydQ9RhdnJScCs/fvHWyBAGAZPTwKqTw2Nbj183MAppn yE2lUxP8R4nFX8h/gn1OrR0ReeR+8OA/FThu5iMbKJAmP2BJq1jEINbHETvdryWIl/mw Hrj+z+6awiV9zXK5YTPgQRTc6KG6HozNjrb5XF+Ncf+r0lJ5JsMawlsPX8rTKYPpxuQU Dup/sh61pVrz1mkLOgDHBEQsJ6qvNDiFFtmYMLaee0wb5fZ5PBXeZec7CA0v0VsbKEyN ncJrqCjtE39KNGNtoOcWti+7Lst+D1tOXXE4xDb9L4htqga9L1NuTJv9etQWLyLZ4kpk xA== Received: from mail.beijerelectronics.com ([195.67.87.131]) by mx07-0057a101.pphosted.com (PPS) with ESMTPS id 3hx0abuxrs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Wed, 17 Aug 2022 09:37:01 +0200 Received: from Orpheus.nch.westermo.com (172.29.100.2) by EX01GLOBAL.beijerelectronics.com (10.101.10.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.2375.17; Wed, 17 Aug 2022 09:37:00 +0200 From: Matthias May To: , CC: , , , , , , , Matthias May Subject: [PATCH net-next] selftests/net: test l2 tunnel TOS/TTL inheriting Date: Wed, 17 Aug 2022 09:36:49 +0200 Message-ID: <20220817073649.26117-1-matthias.may@westermo.com> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [172.29.100.2] X-ClientProxiedBy: wsevst-s0023.westermo.com (192.168.130.120) To EX01GLOBAL.beijerelectronics.com (10.101.10.25) X-Proofpoint-GUID: QuttER8pdkLpt5kxDXIUih3FlLxTgaAJ X-Proofpoint-ORIG-GUID: QuttER8pdkLpt5kxDXIUih3FlLxTgaAJ Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There are currently 3 ip tunnels that are capable of carrying L2 traffic: gretap, vxlan and geneve. They all are capable to inherit the TOS/TTL for the outer IP-header from the inner frame. Add a test that verifies that these fields are correctly inherited. These tests failed before the following commits: b09ab9c92e50 ("ip6_tunnel: allow to inherit from VLAN encapsulated IP") 3f8a8447fd0b ("ip6_gre: use actual protocol to select xmit") 41337f52b967 ("ip6_gre: set DSCP for non-IP") 7ae29fd1be43 ("ip_tunnel: allow to inherit from VLAN encapsulated IP") 7074732c8fae ("ip_tunnels: allow VXLAN/GENEVE to inherit TOS/TTL from VLAN") ca2bb69514a8 ("geneve: do not use RT_TOS for IPv6 flowlabel") b4ab94d6adaa ("geneve: fix TOS inheriting for ipv4") Signed-off-by: Matthias May --- tools/testing/selftests/net/Makefile | 1 + .../selftests/net/l2_tos_ttl_inherit.sh | 390 ++++++++++++++++++ 2 files changed, 391 insertions(+) create mode 100755 tools/testing/selftests/net/l2_tos_ttl_inherit.sh diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests= /net/Makefile index c0ee2955fe54..11a288b67e2f 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -42,6 +42,7 @@ TEST_PROGS +=3D arp_ndisc_evict_nocarrier.sh TEST_PROGS +=3D ndisc_unsolicited_na_test.sh TEST_PROGS +=3D arp_ndisc_untracked_subnets.sh TEST_PROGS +=3D stress_reuseport_listen.sh +TEST_PROGS :=3D l2_tos_ttl_inherit.sh TEST_PROGS_EXTENDED :=3D in_netns.sh setup_loopback.sh setup_veth.sh TEST_PROGS_EXTENDED +=3D toeplitz_client.sh toeplitz.sh TEST_GEN_FILES =3D socket nettest diff --git a/tools/testing/selftests/net/l2_tos_ttl_inherit.sh b/tools/test= ing/selftests/net/l2_tos_ttl_inherit.sh new file mode 100755 index 000000000000..dca1e6f777a8 --- /dev/null +++ b/tools/testing/selftests/net/l2_tos_ttl_inherit.sh @@ -0,0 +1,390 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +# Author: Matthias May +# +# This script evaluates ip tunnels that are capable of carrying L2 traffic +# if they inherit or set the inheritable fields. +# Namely these tunnels are: 'gretap', 'vxlan' and 'geneve'. +# Checked inheritable fields are: TOS and TTL. +# The outer tunnel protocol of 'IPv4' or 'IPv6' is verified- +# As payload frames of type 'IPv4', 'IPv6' and 'other'(ARP) are verified. +# In addition this script also checks if forcing a specific field in the +# outer header is working. + +if [ "$(id -u)" !=3D "0" ]; then + echo "Please run as root." + exit 0 +fi +if ! which tcpdump > /dev/null 2>&1; then + echo "No tcpdump found. Required for this test." + exit 0 +fi + +expected_tos=3D"0x00" +expected_ttl=3D"0" +failed=3Dfalse + +get_random_tos() { + # Get a random hex tos value between 0x00 and 0xfc, a multiple of 4 + echo "0x$(tr -dc '0-9a-f' < /dev/urandom | head -c 1)\ +$(tr -dc '048c' < /dev/urandom | head -c 1)" +} +get_random_ttl() { + # Get a random dec value between 0 and 255 + printf "%d" "0x$(tr -dc '0-9a-f' < /dev/urandom | head -c 2)" +} +get_field() { + # Expects to get the 'head -n 1' of a captured frame by tcpdump. + # Parses this first line and returns the specified field. + local field=3D"$1" + local input=3D"$2" + local found=3Dfalse + input=3D"$(echo "$input" | tr -d '(),')" + for input_field in $input; do + if $found; then + echo "$input_field" + return + fi + # The next field that we iterate over is the looked for value + if [ "$input_field" =3D "$field" ]; then + found=3Dtrue + fi + done + echo "0" +} +setup() { + local type=3D"$1" + local outer=3D"$2" + local inner=3D"$3" + local tos_ttl=3D"$4" + local vlan=3D"$5" + local test_tos=3D"0x00" + local test_ttl=3D"0" + local ns=3D"ip netns exec testing" + + # We don't want a test-tos of 0x00, + # because this is the value that we get when no tos is set. + expected_tos=3D"$(get_random_tos)" + while [ "$expected_tos" =3D "0x00" ]; do + expected_tos=3D"$(get_random_tos)" + done + if [ "$tos_ttl" =3D "random" ]; then + test_tos=3D"$expected_tos" + tos=3D"fixed $test_tos" + elif [ "$tos_ttl" =3D "inherit" ]; then + test_tos=3D"$tos_ttl" + tos=3D"inherit $expected_tos" + fi + + # We don't want a test-ttl of 64 or 0, + # because 64 is when no ttl is set and 0 is not a valid ttl. + expected_ttl=3D"$(get_random_ttl)" + while [ "$expected_ttl" =3D "64" ] || [ "$expected_ttl" =3D "0" ]; do + expected_ttl=3D"$(get_random_ttl)" + done + + if [ "$tos_ttl" =3D "random" ]; then + test_ttl=3D"$expected_ttl" + ttl=3D"fixed $test_ttl" + elif [ "$tos_ttl" =3D "inherit" ]; then + test_ttl=3D"$tos_ttl" + ttl=3D"inherit $expected_ttl" + fi + printf "=E2=94=82%7s =E2=94=82%6s =E2=94=82%6s =E2=94=82%13s =E2=94=82%13= s =E2=94=82%6s =E2=94=82" \ + "$type" "$outer" "$inner" "$tos" "$ttl" "$vlan" + + # Create 'testing' netns, veth pair and connect main ns with testing ns + ip netns add testing + ip link add type veth + ip link set veth1 netns testing + ip link set veth0 up + $ns ip link set veth1 up + ip addr flush dev veth0 + $ns ip addr flush dev veth1 + + local local_addr1=3D"" + local local_addr2=3D"" + if [ "$type" =3D "gre" ] || [ "$type" =3D "vxlan" ]; then + if [ "$outer" =3D "4" ]; then + local_addr1=3D"local 198.18.0.1" + local_addr2=3D"local 198.18.0.2" + elif [ "$outer" =3D "6" ]; then + local_addr1=3D"local fdd1:ced0:5d88:3fce::1" + local_addr2=3D"local fdd1:ced0:5d88:3fce::2" + fi + fi + local vxlan=3D"" + if [ "$type" =3D "vxlan" ]; then + vxlan=3D"vni 100 dstport 4789" + fi + local geneve=3D"" + if [ "$type" =3D "geneve" ]; then + geneve=3D"vni 100" + fi + # Create tunnel and assign outer IPv4/IPv6 addresses + if [ "$outer" =3D "4" ]; then + if [ "$type" =3D "gre" ]; then + type=3D"gretap" + fi + ip addr add 198.18.0.1/24 dev veth0 + $ns ip addr add 198.18.0.2/24 dev veth1 + ip link add name tep0 type $type $local_addr1 remote \ + 198.18.0.2 tos $test_tos ttl $test_ttl $vxlan $geneve + $ns ip link add name tep1 type $type $local_addr2 remote \ + 198.18.0.1 tos $test_tos ttl $test_ttl $vxlan $geneve + elif [ "$outer" =3D "6" ]; then + if [ "$type" =3D "gre" ]; then + type=3D"ip6gretap" + fi + ip addr add fdd1:ced0:5d88:3fce::1/64 dev veth0 + $ns ip addr add fdd1:ced0:5d88:3fce::2/64 dev veth1 + ip link add name tep0 type $type $local_addr1 \ + remote fdd1:ced0:5d88:3fce::2 tos $test_tos ttl $test_ttl \ + $vxlan $geneve + $ns ip link add name tep1 type $type $local_addr2 \ + remote fdd1:ced0:5d88:3fce::1 tos $test_tos ttl $test_ttl \ + $vxlan $geneve + fi + + # Bring L2-tunnel link up and create VLAN on top + ip link set tep0 up + $ns ip link set tep1 up + ip addr flush dev tep0 + $ns ip addr flush dev tep1 + local parent + if $vlan; then + parent=3D"vlan99-" + ip link add link tep0 name ${parent}0 type vlan id 99 + $ns ip link add link tep1 name ${parent}1 type vlan id 99 + ip link set ${parent}0 up + $ns ip link set ${parent}1 up + ip addr flush dev ${parent}0 + $ns ip addr flush dev ${parent}1 + else + parent=3D"tep" + fi + + # Assign inner IPv4/IPv6 addresses + if [ "$inner" =3D "4" ] || [ "$inner" =3D "other" ]; then + ip addr add 198.19.0.1/24 brd + dev ${parent}0 + $ns ip addr add 198.19.0.2/24 brd + dev ${parent}1 + elif [ "$inner" =3D "6" ]; then + ip addr add fdd4:96cf:4eae:443b::1/64 dev ${parent}0 + $ns ip addr add fdd4:96cf:4eae:443b::2/64 dev ${parent}1 + fi +} + +verify() { + local outer=3D"$1" + local inner=3D"$2" + local tos_ttl=3D"$3" + local vlan=3D"$4" + + local ping_pid out captured_tos captured_ttl result + + local ping_dst + if [ "$inner" =3D "4" ]; then + ping_dst=3D"198.19.0.2" + elif [ "$inner" =3D "6" ]; then + ping_dst=3D"fdd4:96cf:4eae:443b::2" + elif [ "$inner" =3D "other" ]; then + ping_dst=3D"198.19.0.3" # Generates ARPs which are not IPv4/IPv6 + fi + if [ "$tos_ttl" =3D "inherit" ]; then + ping -i 0.1 $ping_dst -Q "$expected_tos" -t "$expected_ttl" \ + 2>/dev/null 1>&2 & ping_pid=3D"$!" + else + ping -i 0.1 $ping_dst 2>/dev/null 1>&2 & ping_pid=3D"$!" + fi + local tunnel_type_offset tunnel_type_proto req_proto_offset req_offset + if [ "$type" =3D "gre" ]; then + tunnel_type_proto=3D"0x2f" + elif [ "$type" =3D "vxlan" ] || [ "$type" =3D "geneve" ]; then + tunnel_type_proto=3D"0x11" + fi + if [ "$outer" =3D "4" ]; then + tunnel_type_offset=3D"9" + if [ "$inner" =3D "4" ]; then + req_proto_offset=3D"47" + req_offset=3D"58" + if [ "$type" =3D "vxlan" ] || [ "$type" =3D "geneve" ]; then + req_proto_offset=3D"$((req_proto_offset + 12))" + req_offset=3D"$((req_offset + 12))" + fi + if $vlan; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + out=3D"$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ + ip[$tunnel_type_offset] =3D $tunnel_type_proto and \ + ip[$req_proto_offset] =3D 0x01 and \ + ip[$req_offset] =3D 0x08 2>/dev/null | head -n 1)" + elif [ "$inner" =3D "6" ]; then + req_proto_offset=3D"44" + req_offset=3D"78" + if [ "$type" =3D "vxlan" ] || [ "$type" =3D "geneve" ]; then + req_proto_offset=3D"$((req_proto_offset + 12))" + req_offset=3D"$((req_offset + 12))" + fi + if $vlan; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + out=3D"$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ + ip[$tunnel_type_offset] =3D $tunnel_type_proto and \ + ip[$req_proto_offset] =3D 0x3a and \ + ip[$req_offset] =3D 0x80 2>/dev/null | head -n 1)" + elif [ "$inner" =3D "other" ]; then + req_proto_offset=3D"36" + req_offset=3D"45" + if [ "$type" =3D "vxlan" ] || [ "$type" =3D "geneve" ]; then + req_proto_offset=3D"$((req_proto_offset + 12))" + req_offset=3D"$((req_offset + 12))" + fi + if $vlan; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + if [ "$tos_ttl" =3D "inherit" ]; then + expected_tos=3D"0x00" + expected_ttl=3D"64" + fi + out=3D"$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ + ip[$tunnel_type_offset] =3D $tunnel_type_proto and \ + ip[$req_proto_offset] =3D 0x08 and \ + ip[$((req_proto_offset + 1))] =3D 0x06 and \ + ip[$req_offset] =3D 0x01 2>/dev/null | head -n 1)" + fi + elif [ "$outer" =3D "6" ]; then + if [ "$type" =3D "gre" ]; then + tunnel_type_offset=3D"40" + elif [ "$type" =3D "vxlan" ] || [ "$type" =3D "geneve" ]; then + tunnel_type_offset=3D"6" + fi + if [ "$inner" =3D "4" ]; then + local req_proto_offset=3D"75" + local req_offset=3D"86" + if [ "$type" =3D "vxlan" ] || [ "$type" =3D "geneve" ]; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + if $vlan; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + out=3D"$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ + ip6[$tunnel_type_offset] =3D $tunnel_type_proto and \ + ip6[$req_proto_offset] =3D 0x01 and \ + ip6[$req_offset] =3D 0x08 2>/dev/null | head -n 1)" + elif [ "$inner" =3D "6" ]; then + local req_proto_offset=3D"72" + local req_offset=3D"106" + if [ "$type" =3D "vxlan" ] || [ "$type" =3D "geneve" ]; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + if $vlan; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + out=3D"$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ + ip6[$tunnel_type_offset] =3D $tunnel_type_proto and \ + ip6[$req_proto_offset] =3D 0x3a and \ + ip6[$req_offset] =3D 0x80 2>/dev/null | head -n 1)" + elif [ "$inner" =3D "other" ]; then + local req_proto_offset=3D"64" + local req_offset=3D"73" + if [ "$type" =3D "vxlan" ] || [ "$type" =3D "geneve" ]; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + if $vlan; then + req_proto_offset=3D"$((req_proto_offset + 4))" + req_offset=3D"$((req_offset + 4))" + fi + if [ "$tos_ttl" =3D "inherit" ]; then + expected_tos=3D"0x00" + expected_ttl=3D"64" + fi + out=3D"$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \ + ip6[$tunnel_type_offset] =3D $tunnel_type_proto and \ + ip6[$req_proto_offset] =3D 0x08 and \ + ip6[$((req_proto_offset + 1))] =3D 0x06 and \ + ip6[$req_offset] =3D 0x01 2>/dev/null | head -n 1)" + fi + fi + kill -9 $ping_pid + wait $ping_pid 2>/dev/null + result=3D"FAIL" + if [ "$outer" =3D "4" ]; then + captured_ttl=3D"$(get_field "ttl" "$out")" + captured_tos=3D"$(printf "0x%02x" "$(get_field "tos" "$out")")" + if [ "$captured_tos" =3D "$expected_tos" ] && + [ "$captured_ttl" =3D "$expected_ttl" ]; then + result=3D"OK" + fi + elif [ "$outer" =3D "6" ]; then + captured_ttl=3D"$(get_field "hlim" "$out")" + captured_tos=3D"$(printf "0x%02x" "$(get_field "class" "$out")")" + if [ "$captured_tos" =3D "$expected_tos" ] && + [ "$captured_ttl" =3D "$expected_ttl" ]; then + result=3D"OK" + fi + fi + + printf "%7s =E2=94=82\n" "$result" + if [ "$result" =3D "FAIL" ]; then + failed=3Dtrue + if [ "$captured_tos" !=3D "$expected_tos" ]; then + printf "=E2=94=82%43s%27s =E2=94=82\n" \ + "Expected TOS value: $expected_tos" \ + "Captured TOS value: $captured_tos" + fi + if [ "$captured_ttl" !=3D "$expected_ttl" ]; then + printf "=E2=94=82%43s%27s =E2=94=82\n" \ + "Expected TTL value: $expected_ttl" \ + "Captured TTL value: $captured_ttl" + fi + printf "=E2=94=82%71s=E2=94=82\n" " " + fi +} + +cleanup() { + ip link del veth0 2>/dev/null + ip netns del testing 2>/dev/null + ip link del tep0 2>/dev/null +} + +printf "=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=AC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=AC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=AC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =AC" +printf "=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=AC=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=AC=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90\n" +for type in gre vxlan geneve; do + if ! $(modprobe "$type" 2>/dev/null); then + continue + fi + for outer in 4 6; do + printf "=E2=94=9C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=BC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=BC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=BC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=BC" + printf "=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=BC=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=BC=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=A4= \n" + printf "=E2=94=82 Type =E2=94=82 outer | inner =E2=94=82 tos = =E2=94=82" + printf " ttl =E2=94=82 vlan =E2=94=82 result =E2=94=82\n" + for inner in 4 6 other; do + printf "=E2=94=9C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=BC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=BC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=BC=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=BC" + printf "=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=BC=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=BC=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=A4= \n" + for tos_ttl in inherit random; do + for vlan in false true; do + setup "$type" "$outer" "$inner" \ + "$tos_ttl" "$vlan" + verify "$outer" "$inner" "$tos_ttl" \ + "$vlan" + cleanup + done + done + done + done +done +printf "=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=B4=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=B4=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=B4=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =B4" +printf "=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=B4=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=B4=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98\n" + +if $failed; then + exit 1 +fi --=20 2.35.1