1305c0418SVladimir Nikishkin#!/bin/bash 2305c0418SVladimir Nikishkin# SPDX-License-Identifier: GPL-2.0 3305c0418SVladimir Nikishkin 4305c0418SVladimir Nikishkin# This test is for checking the [no]localbypass VXLAN device option. The test 5305c0418SVladimir Nikishkin# configures two VXLAN devices in the same network namespace and a tc filter on 6305c0418SVladimir Nikishkin# the loopback device that drops encapsulated packets. The test sends packets 7305c0418SVladimir Nikishkin# from the first VXLAN device and verifies that by default these packets are 8305c0418SVladimir Nikishkin# received by the second VXLAN device. The test then enables the nolocalbypass 9305c0418SVladimir Nikishkin# option and verifies that packets are no longer received by the second VXLAN 10305c0418SVladimir Nikishkin# device. 11305c0418SVladimir Nikishkin 12305c0418SVladimir Nikishkinret=0 13305c0418SVladimir Nikishkin# Kselftest framework requirement - SKIP code is 4. 14305c0418SVladimir Nikishkinksft_skip=4 15305c0418SVladimir Nikishkin 16305c0418SVladimir NikishkinTESTS=" 17305c0418SVladimir Nikishkin nolocalbypass 18305c0418SVladimir Nikishkin" 19305c0418SVladimir NikishkinVERBOSE=0 20305c0418SVladimir NikishkinPAUSE_ON_FAIL=no 21305c0418SVladimir NikishkinPAUSE=no 22305c0418SVladimir Nikishkin 23305c0418SVladimir Nikishkin################################################################################ 24305c0418SVladimir Nikishkin# Utilities 25305c0418SVladimir Nikishkin 26305c0418SVladimir Nikishkinlog_test() 27305c0418SVladimir Nikishkin{ 28305c0418SVladimir Nikishkin local rc=$1 29305c0418SVladimir Nikishkin local expected=$2 30305c0418SVladimir Nikishkin local msg="$3" 31305c0418SVladimir Nikishkin 32305c0418SVladimir Nikishkin if [ ${rc} -eq ${expected} ]; then 33305c0418SVladimir Nikishkin printf "TEST: %-60s [ OK ]\n" "${msg}" 34305c0418SVladimir Nikishkin nsuccess=$((nsuccess+1)) 35305c0418SVladimir Nikishkin else 36305c0418SVladimir Nikishkin ret=1 37305c0418SVladimir Nikishkin nfail=$((nfail+1)) 38305c0418SVladimir Nikishkin printf "TEST: %-60s [FAIL]\n" "${msg}" 39305c0418SVladimir Nikishkin if [ "$VERBOSE" = "1" ]; then 40305c0418SVladimir Nikishkin echo " rc=$rc, expected $expected" 41305c0418SVladimir Nikishkin fi 42305c0418SVladimir Nikishkin 43305c0418SVladimir Nikishkin if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 44305c0418SVladimir Nikishkin echo 45305c0418SVladimir Nikishkin echo "hit enter to continue, 'q' to quit" 46305c0418SVladimir Nikishkin read a 47305c0418SVladimir Nikishkin [ "$a" = "q" ] && exit 1 48305c0418SVladimir Nikishkin fi 49305c0418SVladimir Nikishkin fi 50305c0418SVladimir Nikishkin 51305c0418SVladimir Nikishkin if [ "${PAUSE}" = "yes" ]; then 52305c0418SVladimir Nikishkin echo 53305c0418SVladimir Nikishkin echo "hit enter to continue, 'q' to quit" 54305c0418SVladimir Nikishkin read a 55305c0418SVladimir Nikishkin [ "$a" = "q" ] && exit 1 56305c0418SVladimir Nikishkin fi 57305c0418SVladimir Nikishkin 58305c0418SVladimir Nikishkin [ "$VERBOSE" = "1" ] && echo 59305c0418SVladimir Nikishkin} 60305c0418SVladimir Nikishkin 61305c0418SVladimir Nikishkinrun_cmd() 62305c0418SVladimir Nikishkin{ 63305c0418SVladimir Nikishkin local cmd="$1" 64305c0418SVladimir Nikishkin local out 65305c0418SVladimir Nikishkin local stderr="2>/dev/null" 66305c0418SVladimir Nikishkin 67305c0418SVladimir Nikishkin if [ "$VERBOSE" = "1" ]; then 68305c0418SVladimir Nikishkin printf "COMMAND: $cmd\n" 69305c0418SVladimir Nikishkin stderr= 70305c0418SVladimir Nikishkin fi 71305c0418SVladimir Nikishkin 72305c0418SVladimir Nikishkin out=$(eval $cmd $stderr) 73305c0418SVladimir Nikishkin rc=$? 74305c0418SVladimir Nikishkin if [ "$VERBOSE" = "1" -a -n "$out" ]; then 75305c0418SVladimir Nikishkin echo " $out" 76305c0418SVladimir Nikishkin fi 77305c0418SVladimir Nikishkin 78305c0418SVladimir Nikishkin return $rc 79305c0418SVladimir Nikishkin} 80305c0418SVladimir Nikishkin 81305c0418SVladimir Nikishkintc_check_packets() 82305c0418SVladimir Nikishkin{ 83305c0418SVladimir Nikishkin local ns=$1; shift 84305c0418SVladimir Nikishkin local id=$1; shift 85305c0418SVladimir Nikishkin local handle=$1; shift 86305c0418SVladimir Nikishkin local count=$1; shift 87305c0418SVladimir Nikishkin local pkts 88305c0418SVladimir Nikishkin 89305c0418SVladimir Nikishkin sleep 0.1 90305c0418SVladimir Nikishkin pkts=$(tc -n $ns -j -s filter show $id \ 91305c0418SVladimir Nikishkin | jq ".[] | select(.options.handle == $handle) | \ 92305c0418SVladimir Nikishkin .options.actions[0].stats.packets") 93305c0418SVladimir Nikishkin [[ $pkts == $count ]] 94305c0418SVladimir Nikishkin} 95305c0418SVladimir Nikishkin 96305c0418SVladimir Nikishkin################################################################################ 97305c0418SVladimir Nikishkin# Setup 98305c0418SVladimir Nikishkin 99305c0418SVladimir Nikishkinsetup() 100305c0418SVladimir Nikishkin{ 101305c0418SVladimir Nikishkin ip netns add ns1 102305c0418SVladimir Nikishkin 103305c0418SVladimir Nikishkin ip -n ns1 link set dev lo up 104305c0418SVladimir Nikishkin ip -n ns1 address add 192.0.2.1/32 dev lo 105305c0418SVladimir Nikishkin ip -n ns1 address add 198.51.100.1/32 dev lo 106305c0418SVladimir Nikishkin 107305c0418SVladimir Nikishkin ip -n ns1 link add name vx0 up type vxlan id 100 local 198.51.100.1 \ 108305c0418SVladimir Nikishkin dstport 4789 nolearning 109305c0418SVladimir Nikishkin ip -n ns1 link add name vx1 up type vxlan id 100 dstport 4790 110305c0418SVladimir Nikishkin} 111305c0418SVladimir Nikishkin 112305c0418SVladimir Nikishkincleanup() 113305c0418SVladimir Nikishkin{ 114305c0418SVladimir Nikishkin ip netns del ns1 &> /dev/null 115305c0418SVladimir Nikishkin} 116305c0418SVladimir Nikishkin 117305c0418SVladimir Nikishkin################################################################################ 118305c0418SVladimir Nikishkin# Tests 119305c0418SVladimir Nikishkin 120305c0418SVladimir Nikishkinnolocalbypass() 121305c0418SVladimir Nikishkin{ 122305c0418SVladimir Nikishkin local smac=00:01:02:03:04:05 123305c0418SVladimir Nikishkin local dmac=00:0a:0b:0c:0d:0e 124305c0418SVladimir Nikishkin 125305c0418SVladimir Nikishkin run_cmd "bridge -n ns1 fdb add $dmac dev vx0 self static dst 192.0.2.1 port 4790" 126305c0418SVladimir Nikishkin 127305c0418SVladimir Nikishkin run_cmd "tc -n ns1 qdisc add dev vx1 clsact" 128305c0418SVladimir Nikishkin run_cmd "tc -n ns1 filter add dev vx1 ingress pref 1 handle 101 proto all flower src_mac $smac dst_mac $dmac action pass" 129305c0418SVladimir Nikishkin 130305c0418SVladimir Nikishkin run_cmd "tc -n ns1 qdisc add dev lo clsact" 131305c0418SVladimir Nikishkin run_cmd "tc -n ns1 filter add dev lo ingress pref 1 handle 101 proto ip flower ip_proto udp dst_port 4790 action drop" 132305c0418SVladimir Nikishkin 133*26a4dd83SVladimir Nikishkin run_cmd "ip -n ns1 -d -j link show dev vx0 | jq -e '.[][\"linkinfo\"][\"info_data\"][\"localbypass\"] == true'" 134305c0418SVladimir Nikishkin log_test $? 0 "localbypass enabled" 135305c0418SVladimir Nikishkin 136305c0418SVladimir Nikishkin run_cmd "ip netns exec ns1 mausezahn vx0 -a $smac -b $dmac -c 1 -p 100 -q" 137305c0418SVladimir Nikishkin 138305c0418SVladimir Nikishkin tc_check_packets "ns1" "dev vx1 ingress" 101 1 139305c0418SVladimir Nikishkin log_test $? 0 "Packet received by local VXLAN device - localbypass" 140305c0418SVladimir Nikishkin 141305c0418SVladimir Nikishkin run_cmd "ip -n ns1 link set dev vx0 type vxlan nolocalbypass" 142305c0418SVladimir Nikishkin 143*26a4dd83SVladimir Nikishkin run_cmd "ip -n ns1 -d -j link show dev vx0 | jq -e '.[][\"linkinfo\"][\"info_data\"][\"localbypass\"] == false'" 144305c0418SVladimir Nikishkin log_test $? 0 "localbypass disabled" 145305c0418SVladimir Nikishkin 146305c0418SVladimir Nikishkin run_cmd "ip netns exec ns1 mausezahn vx0 -a $smac -b $dmac -c 1 -p 100 -q" 147305c0418SVladimir Nikishkin 148305c0418SVladimir Nikishkin tc_check_packets "ns1" "dev vx1 ingress" 101 1 149305c0418SVladimir Nikishkin log_test $? 0 "Packet not received by local VXLAN device - nolocalbypass" 150305c0418SVladimir Nikishkin 151305c0418SVladimir Nikishkin run_cmd "ip -n ns1 link set dev vx0 type vxlan localbypass" 152305c0418SVladimir Nikishkin 153*26a4dd83SVladimir Nikishkin run_cmd "ip -n ns1 -d -j link show dev vx0 | jq -e '.[][\"linkinfo\"][\"info_data\"][\"localbypass\"] == true'" 154305c0418SVladimir Nikishkin log_test $? 0 "localbypass enabled" 155305c0418SVladimir Nikishkin 156305c0418SVladimir Nikishkin run_cmd "ip netns exec ns1 mausezahn vx0 -a $smac -b $dmac -c 1 -p 100 -q" 157305c0418SVladimir Nikishkin 158305c0418SVladimir Nikishkin tc_check_packets "ns1" "dev vx1 ingress" 101 2 159305c0418SVladimir Nikishkin log_test $? 0 "Packet received by local VXLAN device - localbypass" 160305c0418SVladimir Nikishkin} 161305c0418SVladimir Nikishkin 162305c0418SVladimir Nikishkin################################################################################ 163305c0418SVladimir Nikishkin# Usage 164305c0418SVladimir Nikishkin 165305c0418SVladimir Nikishkinusage() 166305c0418SVladimir Nikishkin{ 167305c0418SVladimir Nikishkin cat <<EOF 168305c0418SVladimir Nikishkinusage: ${0##*/} OPTS 169305c0418SVladimir Nikishkin 170305c0418SVladimir Nikishkin -t <test> Test(s) to run (default: all) 171305c0418SVladimir Nikishkin (options: $TESTS) 172305c0418SVladimir Nikishkin -p Pause on fail 173305c0418SVladimir Nikishkin -P Pause after each test before cleanup 174305c0418SVladimir Nikishkin -v Verbose mode (show commands and output) 175305c0418SVladimir NikishkinEOF 176305c0418SVladimir Nikishkin} 177305c0418SVladimir Nikishkin 178305c0418SVladimir Nikishkin################################################################################ 179305c0418SVladimir Nikishkin# Main 180305c0418SVladimir Nikishkin 181305c0418SVladimir Nikishkintrap cleanup EXIT 182305c0418SVladimir Nikishkin 183305c0418SVladimir Nikishkinwhile getopts ":t:pPvh" opt; do 184305c0418SVladimir Nikishkin case $opt in 185305c0418SVladimir Nikishkin t) TESTS=$OPTARG ;; 186305c0418SVladimir Nikishkin p) PAUSE_ON_FAIL=yes;; 187305c0418SVladimir Nikishkin P) PAUSE=yes;; 188305c0418SVladimir Nikishkin v) VERBOSE=$(($VERBOSE + 1));; 189305c0418SVladimir Nikishkin h) usage; exit 0;; 190305c0418SVladimir Nikishkin *) usage; exit 1;; 191305c0418SVladimir Nikishkin esac 192305c0418SVladimir Nikishkindone 193305c0418SVladimir Nikishkin 194305c0418SVladimir Nikishkin# Make sure we don't pause twice. 195305c0418SVladimir Nikishkin[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no 196305c0418SVladimir Nikishkin 197305c0418SVladimir Nikishkinif [ "$(id -u)" -ne 0 ];then 198305c0418SVladimir Nikishkin echo "SKIP: Need root privileges" 199305c0418SVladimir Nikishkin exit $ksft_skip; 200305c0418SVladimir Nikishkinfi 201305c0418SVladimir Nikishkin 202305c0418SVladimir Nikishkinif [ ! -x "$(command -v ip)" ]; then 203305c0418SVladimir Nikishkin echo "SKIP: Could not run test without ip tool" 204305c0418SVladimir Nikishkin exit $ksft_skip 205305c0418SVladimir Nikishkinfi 206305c0418SVladimir Nikishkin 207305c0418SVladimir Nikishkinif [ ! -x "$(command -v bridge)" ]; then 208305c0418SVladimir Nikishkin echo "SKIP: Could not run test without bridge tool" 209305c0418SVladimir Nikishkin exit $ksft_skip 210305c0418SVladimir Nikishkinfi 211305c0418SVladimir Nikishkin 212305c0418SVladimir Nikishkinif [ ! -x "$(command -v mausezahn)" ]; then 213305c0418SVladimir Nikishkin echo "SKIP: Could not run test without mausezahn tool" 214305c0418SVladimir Nikishkin exit $ksft_skip 215305c0418SVladimir Nikishkinfi 216305c0418SVladimir Nikishkin 217305c0418SVladimir Nikishkinif [ ! -x "$(command -v jq)" ]; then 218305c0418SVladimir Nikishkin echo "SKIP: Could not run test without jq tool" 219305c0418SVladimir Nikishkin exit $ksft_skip 220305c0418SVladimir Nikishkinfi 221305c0418SVladimir Nikishkin 222305c0418SVladimir Nikishkinip link help vxlan 2>&1 | grep -q "localbypass" 223305c0418SVladimir Nikishkinif [ $? -ne 0 ]; then 224305c0418SVladimir Nikishkin echo "SKIP: iproute2 ip too old, missing VXLAN nolocalbypass support" 225305c0418SVladimir Nikishkin exit $ksft_skip 226305c0418SVladimir Nikishkinfi 227305c0418SVladimir Nikishkin 228305c0418SVladimir Nikishkincleanup 229305c0418SVladimir Nikishkin 230305c0418SVladimir Nikishkinfor t in $TESTS 231305c0418SVladimir Nikishkindo 232305c0418SVladimir Nikishkin setup; $t; cleanup; 233305c0418SVladimir Nikishkindone 234305c0418SVladimir Nikishkin 235305c0418SVladimir Nikishkinif [ "$TESTS" != "none" ]; then 236305c0418SVladimir Nikishkin printf "\nTests passed: %3d\n" ${nsuccess} 237305c0418SVladimir Nikishkin printf "Tests failed: %3d\n" ${nfail} 238305c0418SVladimir Nikishkinfi 239305c0418SVladimir Nikishkin 240305c0418SVladimir Nikishkinexit $ret 241