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