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