xref: /openbmc/linux/tools/testing/selftests/net/forwarding/pedit_ip.sh (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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