1*92ad3828SDanielle Ratson#!/bin/bash 2*92ad3828SDanielle Ratson# SPDX-License-Identifier: GPL-2.0 3*92ad3828SDanielle Ratson 4*92ad3828SDanielle Ratson# This test sends traffic from H1 to H2. Either on ingress of $swp1, or on 5*92ad3828SDanielle Ratson# egress of $swp2, the traffic is acted upon by a pedit action. An ingress 6*92ad3828SDanielle Ratson# filter installed on $h2 verifies that the packet looks like expected. 7*92ad3828SDanielle Ratson# 8*92ad3828SDanielle Ratson# +----------------------+ +----------------------+ 9*92ad3828SDanielle Ratson# | H1 | | H2 | 10*92ad3828SDanielle Ratson# | + $h1 | | $h2 + | 11*92ad3828SDanielle Ratson# | | 192.0.2.1/28 | | 192.0.2.2/28 | | 12*92ad3828SDanielle Ratson# +----|-----------------+ +----------------|-----+ 13*92ad3828SDanielle Ratson# | | 14*92ad3828SDanielle Ratson# +----|----------------------------------------------------------------|-----+ 15*92ad3828SDanielle Ratson# | SW | | | 16*92ad3828SDanielle Ratson# | +-|----------------------------------------------------------------|-+ | 17*92ad3828SDanielle Ratson# | | + $swp1 BR $swp2 + | | 18*92ad3828SDanielle Ratson# | +--------------------------------------------------------------------+ | 19*92ad3828SDanielle Ratson# +---------------------------------------------------------------------------+ 20*92ad3828SDanielle Ratson 21*92ad3828SDanielle RatsonALL_TESTS=" 22*92ad3828SDanielle Ratson ping_ipv4 23*92ad3828SDanielle Ratson ping_ipv6 24*92ad3828SDanielle Ratson test_ip4_src 25*92ad3828SDanielle Ratson test_ip4_dst 26*92ad3828SDanielle Ratson test_ip6_src 27*92ad3828SDanielle Ratson test_ip6_dst 28*92ad3828SDanielle Ratson" 29*92ad3828SDanielle Ratson 30*92ad3828SDanielle RatsonNUM_NETIFS=4 31*92ad3828SDanielle Ratsonsource lib.sh 32*92ad3828SDanielle Ratsonsource tc_common.sh 33*92ad3828SDanielle Ratson 34*92ad3828SDanielle Ratsonh1_create() 35*92ad3828SDanielle Ratson{ 36*92ad3828SDanielle Ratson simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64 37*92ad3828SDanielle Ratson} 38*92ad3828SDanielle Ratson 39*92ad3828SDanielle Ratsonh1_destroy() 40*92ad3828SDanielle Ratson{ 41*92ad3828SDanielle Ratson simple_if_fini $h1 192.0.2.1/28 2001:db8:1::1/64 42*92ad3828SDanielle Ratson} 43*92ad3828SDanielle Ratson 44*92ad3828SDanielle Ratsonh2_create() 45*92ad3828SDanielle Ratson{ 46*92ad3828SDanielle Ratson simple_if_init $h2 192.0.2.2/28 2001:db8:1::2/64 47*92ad3828SDanielle Ratson tc qdisc add dev $h2 clsact 48*92ad3828SDanielle Ratson} 49*92ad3828SDanielle Ratson 50*92ad3828SDanielle Ratsonh2_destroy() 51*92ad3828SDanielle Ratson{ 52*92ad3828SDanielle Ratson tc qdisc del dev $h2 clsact 53*92ad3828SDanielle Ratson simple_if_fini $h2 192.0.2.2/28 2001:db8:1::2/64 54*92ad3828SDanielle Ratson} 55*92ad3828SDanielle Ratson 56*92ad3828SDanielle Ratsonswitch_create() 57*92ad3828SDanielle Ratson{ 58*92ad3828SDanielle Ratson ip link add name br1 up type bridge vlan_filtering 1 59*92ad3828SDanielle Ratson ip link set dev $swp1 master br1 60*92ad3828SDanielle Ratson ip link set dev $swp1 up 61*92ad3828SDanielle Ratson ip link set dev $swp2 master br1 62*92ad3828SDanielle Ratson ip link set dev $swp2 up 63*92ad3828SDanielle Ratson 64*92ad3828SDanielle Ratson tc qdisc add dev $swp1 clsact 65*92ad3828SDanielle Ratson tc qdisc add dev $swp2 clsact 66*92ad3828SDanielle Ratson} 67*92ad3828SDanielle Ratson 68*92ad3828SDanielle Ratsonswitch_destroy() 69*92ad3828SDanielle Ratson{ 70*92ad3828SDanielle Ratson tc qdisc del dev $swp2 clsact 71*92ad3828SDanielle Ratson tc qdisc del dev $swp1 clsact 72*92ad3828SDanielle Ratson 73*92ad3828SDanielle Ratson ip link set dev $swp2 down 74*92ad3828SDanielle Ratson ip link set dev $swp2 nomaster 75*92ad3828SDanielle Ratson ip link set dev $swp1 down 76*92ad3828SDanielle Ratson ip link set dev $swp1 nomaster 77*92ad3828SDanielle Ratson ip link del dev br1 78*92ad3828SDanielle Ratson} 79*92ad3828SDanielle Ratson 80*92ad3828SDanielle Ratsonsetup_prepare() 81*92ad3828SDanielle Ratson{ 82*92ad3828SDanielle Ratson h1=${NETIFS[p1]} 83*92ad3828SDanielle Ratson swp1=${NETIFS[p2]} 84*92ad3828SDanielle Ratson 85*92ad3828SDanielle Ratson swp2=${NETIFS[p3]} 86*92ad3828SDanielle Ratson h2=${NETIFS[p4]} 87*92ad3828SDanielle Ratson 88*92ad3828SDanielle Ratson h2mac=$(mac_get $h2) 89*92ad3828SDanielle Ratson 90*92ad3828SDanielle Ratson vrf_prepare 91*92ad3828SDanielle Ratson h1_create 92*92ad3828SDanielle Ratson h2_create 93*92ad3828SDanielle Ratson switch_create 94*92ad3828SDanielle Ratson} 95*92ad3828SDanielle Ratson 96*92ad3828SDanielle Ratsoncleanup() 97*92ad3828SDanielle Ratson{ 98*92ad3828SDanielle Ratson pre_cleanup 99*92ad3828SDanielle Ratson 100*92ad3828SDanielle Ratson switch_destroy 101*92ad3828SDanielle Ratson h2_destroy 102*92ad3828SDanielle Ratson h1_destroy 103*92ad3828SDanielle Ratson vrf_cleanup 104*92ad3828SDanielle Ratson} 105*92ad3828SDanielle Ratson 106*92ad3828SDanielle Ratsonping_ipv4() 107*92ad3828SDanielle Ratson{ 108*92ad3828SDanielle Ratson ping_test $h1 192.0.2.2 109*92ad3828SDanielle Ratson} 110*92ad3828SDanielle Ratson 111*92ad3828SDanielle Ratsonping_ipv6() 112*92ad3828SDanielle Ratson{ 113*92ad3828SDanielle Ratson ping6_test $h1 2001:db8:1::2 114*92ad3828SDanielle Ratson} 115*92ad3828SDanielle Ratson 116*92ad3828SDanielle Ratsondo_test_pedit_ip() 117*92ad3828SDanielle Ratson{ 118*92ad3828SDanielle Ratson local pedit_locus=$1; shift 119*92ad3828SDanielle Ratson local pedit_action=$1; shift 120*92ad3828SDanielle Ratson local match_prot=$1; shift 121*92ad3828SDanielle Ratson local match_flower=$1; shift 122*92ad3828SDanielle Ratson local mz_flags=$1; shift 123*92ad3828SDanielle Ratson 124*92ad3828SDanielle Ratson tc filter add $pedit_locus handle 101 pref 1 \ 125*92ad3828SDanielle Ratson flower action pedit ex munge $pedit_action 126*92ad3828SDanielle Ratson tc filter add dev $h2 ingress handle 101 pref 1 prot $match_prot \ 127*92ad3828SDanielle Ratson flower skip_hw $match_flower action pass 128*92ad3828SDanielle Ratson 129*92ad3828SDanielle Ratson RET=0 130*92ad3828SDanielle Ratson 131*92ad3828SDanielle Ratson $MZ $mz_flags $h1 -c 10 -d 20msec -p 100 -a own -b $h2mac -q -t ip 132*92ad3828SDanielle Ratson 133*92ad3828SDanielle Ratson local pkts 134*92ad3828SDanielle Ratson pkts=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= 10" \ 135*92ad3828SDanielle Ratson tc_rule_handle_stats_get "dev $h2 ingress" 101) 136*92ad3828SDanielle Ratson check_err $? "Expected to get 10 packets, but got $pkts." 137*92ad3828SDanielle Ratson 138*92ad3828SDanielle Ratson pkts=$(tc_rule_handle_stats_get "$pedit_locus" 101) 139*92ad3828SDanielle Ratson ((pkts >= 10)) 140*92ad3828SDanielle Ratson check_err $? "Expected to get 10 packets on pedit rule, but got $pkts." 141*92ad3828SDanielle Ratson 142*92ad3828SDanielle Ratson log_test "$pedit_locus pedit $pedit_action" 143*92ad3828SDanielle Ratson 144*92ad3828SDanielle Ratson tc filter del dev $h2 ingress pref 1 145*92ad3828SDanielle Ratson tc filter del $pedit_locus pref 1 146*92ad3828SDanielle Ratson} 147*92ad3828SDanielle Ratson 148*92ad3828SDanielle Ratsondo_test_pedit_ip6() 149*92ad3828SDanielle Ratson{ 150*92ad3828SDanielle Ratson local locus=$1; shift 151*92ad3828SDanielle Ratson local pedit_addr=$1; shift 152*92ad3828SDanielle Ratson local flower_addr=$1; shift 153*92ad3828SDanielle Ratson 154*92ad3828SDanielle Ratson do_test_pedit_ip "$locus" "$pedit_addr set 2001:db8:2::1" ipv6 \ 155*92ad3828SDanielle Ratson "$flower_addr 2001:db8:2::1" \ 156*92ad3828SDanielle Ratson "-6 -A 2001:db8:1::1 -B 2001:db8:1::2" 157*92ad3828SDanielle Ratson} 158*92ad3828SDanielle Ratson 159*92ad3828SDanielle Ratsondo_test_pedit_ip4() 160*92ad3828SDanielle Ratson{ 161*92ad3828SDanielle Ratson local locus=$1; shift 162*92ad3828SDanielle Ratson local pedit_addr=$1; shift 163*92ad3828SDanielle Ratson local flower_addr=$1; shift 164*92ad3828SDanielle Ratson 165*92ad3828SDanielle Ratson do_test_pedit_ip "$locus" "$pedit_addr set 198.51.100.1" ip \ 166*92ad3828SDanielle Ratson "$flower_addr 198.51.100.1" \ 167*92ad3828SDanielle Ratson "-A 192.0.2.1 -B 192.0.2.2" 168*92ad3828SDanielle Ratson} 169*92ad3828SDanielle Ratson 170*92ad3828SDanielle Ratsontest_ip4_src() 171*92ad3828SDanielle Ratson{ 172*92ad3828SDanielle Ratson do_test_pedit_ip4 "dev $swp1 ingress" "ip src" src_ip 173*92ad3828SDanielle Ratson do_test_pedit_ip4 "dev $swp2 egress" "ip src" src_ip 174*92ad3828SDanielle Ratson} 175*92ad3828SDanielle Ratson 176*92ad3828SDanielle Ratsontest_ip4_dst() 177*92ad3828SDanielle Ratson{ 178*92ad3828SDanielle Ratson do_test_pedit_ip4 "dev $swp1 ingress" "ip dst" dst_ip 179*92ad3828SDanielle Ratson do_test_pedit_ip4 "dev $swp2 egress" "ip dst" dst_ip 180*92ad3828SDanielle Ratson} 181*92ad3828SDanielle Ratson 182*92ad3828SDanielle Ratsontest_ip6_src() 183*92ad3828SDanielle Ratson{ 184*92ad3828SDanielle Ratson do_test_pedit_ip6 "dev $swp1 ingress" "ip6 src" src_ip 185*92ad3828SDanielle Ratson do_test_pedit_ip6 "dev $swp2 egress" "ip6 src" src_ip 186*92ad3828SDanielle Ratson} 187*92ad3828SDanielle Ratson 188*92ad3828SDanielle Ratsontest_ip6_dst() 189*92ad3828SDanielle Ratson{ 190*92ad3828SDanielle Ratson do_test_pedit_ip6 "dev $swp1 ingress" "ip6 dst" dst_ip 191*92ad3828SDanielle Ratson do_test_pedit_ip6 "dev $swp2 egress" "ip6 dst" dst_ip 192*92ad3828SDanielle Ratson} 193*92ad3828SDanielle Ratson 194*92ad3828SDanielle Ratsontrap cleanup EXIT 195*92ad3828SDanielle Ratson 196*92ad3828SDanielle Ratsonsetup_prepare 197*92ad3828SDanielle Ratsonsetup_wait 198*92ad3828SDanielle Ratson 199*92ad3828SDanielle Ratsontests_run 200*92ad3828SDanielle Ratson 201*92ad3828SDanielle Ratsonexit $EXIT_STATUS 202