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