1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# Kselftest framework requirement - SKIP code is 4. 5ksft_skip=4 6 7ALL_TESTS="loopback_test" 8NUM_NETIFS=2 9lib_dir=$(dirname "$0") 10source "$lib_dir"/../../../net/forwarding/tc_common.sh 11source "$lib_dir"/../../../net/forwarding/lib.sh 12 13h1_create() 14{ 15 simple_if_init $h1 192.0.2.1/24 16 tc qdisc add dev $h1 clsact 17} 18 19h1_destroy() 20{ 21 tc qdisc del dev $h1 clsact 22 simple_if_fini $h1 192.0.2.1/24 23} 24 25h2_create() 26{ 27 simple_if_init $h2 28} 29 30h2_destroy() 31{ 32 simple_if_fini $h2 33} 34 35loopback_test() 36{ 37 RET=0 38 39 tc filter add dev $h1 ingress protocol arp pref 1 handle 101 flower \ 40 skip_hw arp_op reply arp_tip 192.0.2.1 action drop 41 42 $MZ $h1 -c 1 -t arp -q 43 44 tc_check_packets "dev $h1 ingress" 101 1 45 check_fail $? "Matched on a filter without loopback setup" 46 47 ethtool -K $h1 loopback on 48 check_err $? "Failed to enable loopback" 49 50 setup_wait_dev $h1 51 52 $MZ $h1 -c 1 -t arp -q 53 54 tc_check_packets "dev $h1 ingress" 101 1 55 check_err $? "Did not match on filter with loopback" 56 57 ethtool -K $h1 loopback off 58 check_err $? "Failed to disable loopback" 59 60 $MZ $h1 -c 1 -t arp -q 61 62 tc_check_packets "dev $h1 ingress" 101 2 63 check_fail $? "Matched on a filter after loopback was removed" 64 65 tc filter del dev $h1 ingress protocol arp pref 1 handle 101 flower 66 67 log_test "loopback" 68} 69 70setup_prepare() 71{ 72 h1=${NETIFS[p1]} 73 h2=${NETIFS[p2]} 74 75 vrf_prepare 76 77 h1_create 78 h2_create 79 80 if ethtool -k $h1 | grep loopback | grep -q fixed; then 81 log_test "SKIP: dev $h1 does not support loopback feature" 82 exit $ksft_skip 83 fi 84} 85 86cleanup() 87{ 88 pre_cleanup 89 90 h2_destroy 91 h1_destroy 92 93 vrf_cleanup 94} 95 96trap cleanup EXIT 97 98setup_prepare 99setup_wait 100 101tests_run 102 103exit $EXIT_STATUS 104