1dcc5e1f9SJiri Pirko#!/bin/bash 2dcc5e1f9SJiri Pirko# SPDX-License-Identifier: GPL-2.0 3dcc5e1f9SJiri Pirko 4dcc5e1f9SJiri PirkoALL_TESTS="match_indev_egress_test" 5dcc5e1f9SJiri PirkoNUM_NETIFS=6 6dcc5e1f9SJiri Pirkosource tc_common.sh 7dcc5e1f9SJiri Pirkosource lib.sh 8dcc5e1f9SJiri Pirko 9dcc5e1f9SJiri Pirkoh1_create() 10dcc5e1f9SJiri Pirko{ 11dcc5e1f9SJiri Pirko simple_if_init $h1 192.0.1.1/24 12dcc5e1f9SJiri Pirko 13dcc5e1f9SJiri Pirko ip route add 192.0.2.0/24 vrf v$h1 nexthop via 192.0.1.2 14dcc5e1f9SJiri Pirko ip route add 192.0.3.0/24 vrf v$h1 nexthop via 192.0.1.2 15dcc5e1f9SJiri Pirko} 16dcc5e1f9SJiri Pirko 17dcc5e1f9SJiri Pirkoh1_destroy() 18dcc5e1f9SJiri Pirko{ 19dcc5e1f9SJiri Pirko ip route del 192.0.3.0/24 vrf v$h1 20dcc5e1f9SJiri Pirko ip route del 192.0.2.0/24 vrf v$h1 21dcc5e1f9SJiri Pirko 22dcc5e1f9SJiri Pirko simple_if_fini $h1 192.0.1.1/24 23dcc5e1f9SJiri Pirko} 24dcc5e1f9SJiri Pirko 25dcc5e1f9SJiri Pirkoh2_create() 26dcc5e1f9SJiri Pirko{ 27dcc5e1f9SJiri Pirko simple_if_init $h2 192.0.2.1/24 28dcc5e1f9SJiri Pirko 29dcc5e1f9SJiri Pirko ip route add 192.0.1.0/24 vrf v$h2 nexthop via 192.0.2.2 30dcc5e1f9SJiri Pirko ip route add 192.0.3.0/24 vrf v$h2 nexthop via 192.0.2.2 31dcc5e1f9SJiri Pirko} 32dcc5e1f9SJiri Pirko 33dcc5e1f9SJiri Pirkoh2_destroy() 34dcc5e1f9SJiri Pirko{ 35dcc5e1f9SJiri Pirko ip route del 192.0.3.0/24 vrf v$h2 36dcc5e1f9SJiri Pirko ip route del 192.0.1.0/24 vrf v$h2 37dcc5e1f9SJiri Pirko 38dcc5e1f9SJiri Pirko simple_if_fini $h2 192.0.2.1/24 39dcc5e1f9SJiri Pirko} 40dcc5e1f9SJiri Pirko 41dcc5e1f9SJiri Pirkoh3_create() 42dcc5e1f9SJiri Pirko{ 43dcc5e1f9SJiri Pirko simple_if_init $h3 192.0.3.1/24 44dcc5e1f9SJiri Pirko 45dcc5e1f9SJiri Pirko ip route add 192.0.1.0/24 vrf v$h3 nexthop via 192.0.3.2 46dcc5e1f9SJiri Pirko ip route add 192.0.2.0/24 vrf v$h3 nexthop via 192.0.3.2 47dcc5e1f9SJiri Pirko} 48dcc5e1f9SJiri Pirko 49dcc5e1f9SJiri Pirkoh3_destroy() 50dcc5e1f9SJiri Pirko{ 51dcc5e1f9SJiri Pirko ip route del 192.0.2.0/24 vrf v$h3 52dcc5e1f9SJiri Pirko ip route del 192.0.1.0/24 vrf v$h3 53dcc5e1f9SJiri Pirko 54dcc5e1f9SJiri Pirko simple_if_fini $h3 192.0.3.1/24 55dcc5e1f9SJiri Pirko} 56dcc5e1f9SJiri Pirko 57dcc5e1f9SJiri Pirko 58dcc5e1f9SJiri Pirkorouter_create() 59dcc5e1f9SJiri Pirko{ 60dcc5e1f9SJiri Pirko ip link set dev $rp1 up 61dcc5e1f9SJiri Pirko ip link set dev $rp2 up 62dcc5e1f9SJiri Pirko ip link set dev $rp3 up 63dcc5e1f9SJiri Pirko 64dcc5e1f9SJiri Pirko tc qdisc add dev $rp3 clsact 65dcc5e1f9SJiri Pirko 66dcc5e1f9SJiri Pirko ip address add 192.0.1.2/24 dev $rp1 67dcc5e1f9SJiri Pirko ip address add 192.0.2.2/24 dev $rp2 68dcc5e1f9SJiri Pirko ip address add 192.0.3.2/24 dev $rp3 69dcc5e1f9SJiri Pirko} 70dcc5e1f9SJiri Pirko 71dcc5e1f9SJiri Pirkorouter_destroy() 72dcc5e1f9SJiri Pirko{ 73dcc5e1f9SJiri Pirko ip address del 192.0.3.2/24 dev $rp3 74dcc5e1f9SJiri Pirko ip address del 192.0.2.2/24 dev $rp2 75dcc5e1f9SJiri Pirko ip address del 192.0.1.2/24 dev $rp1 76dcc5e1f9SJiri Pirko 77dcc5e1f9SJiri Pirko tc qdisc del dev $rp3 clsact 78dcc5e1f9SJiri Pirko 79dcc5e1f9SJiri Pirko ip link set dev $rp3 down 80dcc5e1f9SJiri Pirko ip link set dev $rp2 down 81dcc5e1f9SJiri Pirko ip link set dev $rp1 down 82dcc5e1f9SJiri Pirko} 83dcc5e1f9SJiri Pirko 84dcc5e1f9SJiri Pirkomatch_indev_egress_test() 85dcc5e1f9SJiri Pirko{ 86dcc5e1f9SJiri Pirko RET=0 87dcc5e1f9SJiri Pirko 88dcc5e1f9SJiri Pirko tc filter add dev $rp3 egress protocol ip pref 1 handle 101 flower \ 89dcc5e1f9SJiri Pirko $tcflags indev $rp1 dst_ip 192.0.3.1 action drop 90dcc5e1f9SJiri Pirko tc filter add dev $rp3 egress protocol ip pref 2 handle 102 flower \ 91dcc5e1f9SJiri Pirko $tcflags indev $rp2 dst_ip 192.0.3.1 action drop 92dcc5e1f9SJiri Pirko 93dcc5e1f9SJiri Pirko $MZ $h1 -c 1 -p 64 -a $h1mac -b $rp1mac -A 192.0.1.1 -B 192.0.3.1 \ 94dcc5e1f9SJiri Pirko -t ip -q 95dcc5e1f9SJiri Pirko 96dcc5e1f9SJiri Pirko tc_check_packets "dev $rp3 egress" 102 1 97dcc5e1f9SJiri Pirko check_fail $? "Matched on a wrong filter" 98dcc5e1f9SJiri Pirko 99dcc5e1f9SJiri Pirko tc_check_packets "dev $rp3 egress" 101 1 100dcc5e1f9SJiri Pirko check_err $? "Did not match on correct filter" 101dcc5e1f9SJiri Pirko 102dcc5e1f9SJiri Pirko $MZ $h2 -c 1 -p 64 -a $h2mac -b $rp2mac -A 192.0.2.1 -B 192.0.3.1 \ 103dcc5e1f9SJiri Pirko -t ip -q 104dcc5e1f9SJiri Pirko 105dcc5e1f9SJiri Pirko tc_check_packets "dev $rp3 egress" 101 2 106dcc5e1f9SJiri Pirko check_fail $? "Matched on a wrong filter" 107dcc5e1f9SJiri Pirko 108dcc5e1f9SJiri Pirko tc_check_packets "dev $rp3 egress" 102 1 109dcc5e1f9SJiri Pirko check_err $? "Did not match on correct filter" 110dcc5e1f9SJiri Pirko 111dcc5e1f9SJiri Pirko tc filter del dev $rp3 egress protocol ip pref 2 handle 102 flower 112dcc5e1f9SJiri Pirko tc filter del dev $rp3 egress protocol ip pref 1 handle 101 flower 113dcc5e1f9SJiri Pirko 114dcc5e1f9SJiri Pirko log_test "indev egress match ($tcflags)" 115dcc5e1f9SJiri Pirko} 116dcc5e1f9SJiri Pirko 117dcc5e1f9SJiri Pirkosetup_prepare() 118dcc5e1f9SJiri Pirko{ 119dcc5e1f9SJiri Pirko h1=${NETIFS[p1]} 120dcc5e1f9SJiri Pirko rp1=${NETIFS[p2]} 121dcc5e1f9SJiri Pirko 122dcc5e1f9SJiri Pirko h2=${NETIFS[p3]} 123dcc5e1f9SJiri Pirko rp2=${NETIFS[p4]} 124dcc5e1f9SJiri Pirko 125dcc5e1f9SJiri Pirko h3=${NETIFS[p5]} 126dcc5e1f9SJiri Pirko rp3=${NETIFS[p6]} 127dcc5e1f9SJiri Pirko 128dcc5e1f9SJiri Pirko h1mac=$(mac_get $h1) 129dcc5e1f9SJiri Pirko rp1mac=$(mac_get $rp1) 130dcc5e1f9SJiri Pirko h2mac=$(mac_get $h2) 131dcc5e1f9SJiri Pirko rp2mac=$(mac_get $rp2) 132dcc5e1f9SJiri Pirko 133dcc5e1f9SJiri Pirko vrf_prepare 134dcc5e1f9SJiri Pirko 135dcc5e1f9SJiri Pirko h1_create 136dcc5e1f9SJiri Pirko h2_create 137dcc5e1f9SJiri Pirko h3_create 138dcc5e1f9SJiri Pirko 139dcc5e1f9SJiri Pirko router_create 140dcc5e1f9SJiri Pirko 141dcc5e1f9SJiri Pirko forwarding_enable 142dcc5e1f9SJiri Pirko} 143dcc5e1f9SJiri Pirko 144dcc5e1f9SJiri Pirkocleanup() 145dcc5e1f9SJiri Pirko{ 146dcc5e1f9SJiri Pirko pre_cleanup 147dcc5e1f9SJiri Pirko 148dcc5e1f9SJiri Pirko forwarding_restore 149dcc5e1f9SJiri Pirko 150dcc5e1f9SJiri Pirko router_destroy 151dcc5e1f9SJiri Pirko 152dcc5e1f9SJiri Pirko h3_destroy 153dcc5e1f9SJiri Pirko h2_destroy 154dcc5e1f9SJiri Pirko h1_destroy 155dcc5e1f9SJiri Pirko 156dcc5e1f9SJiri Pirko vrf_cleanup 157dcc5e1f9SJiri Pirko} 158dcc5e1f9SJiri Pirko 159dcc5e1f9SJiri Pirkotrap cleanup EXIT 160dcc5e1f9SJiri Pirko 161dcc5e1f9SJiri Pirkosetup_prepare 162dcc5e1f9SJiri Pirkosetup_wait 163dcc5e1f9SJiri Pirko 164dcc5e1f9SJiri Pirkotc_offload_check 165dcc5e1f9SJiri Pirkoif [[ $? -ne 0 ]]; then 166dcc5e1f9SJiri Pirko log_info "Could not test offloaded functionality" 167dcc5e1f9SJiri Pirkoelse 168dcc5e1f9SJiri Pirko tcflags="skip_sw" 169dcc5e1f9SJiri Pirko tests_run 170dcc5e1f9SJiri Pirkofi 171dcc5e1f9SJiri Pirko 172dcc5e1f9SJiri Pirkoexit $EXIT_STATUS 173