1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4ALL_TESTS="shared_block_test match_indev_test"
5NUM_NETIFS=4
6source tc_common.sh
7source lib.sh
8
9tcflags="skip_hw"
10
11h1_create()
12{
13	simple_if_init $h1 192.0.2.1/24
14}
15
16h1_destroy()
17{
18	simple_if_fini $h1 192.0.2.1/24
19}
20
21h2_create()
22{
23	simple_if_init $h2 192.0.2.1/24
24}
25
26h2_destroy()
27{
28	simple_if_fini $h2 192.0.2.1/24
29}
30
31switch_create()
32{
33	simple_if_init $swp1 192.0.2.2/24
34	tc qdisc add dev $swp1 ingress_block 22 egress_block 23 clsact
35
36	simple_if_init $swp2 192.0.2.2/24
37	tc qdisc add dev $swp2 ingress_block 22 egress_block 23 clsact
38}
39
40switch_destroy()
41{
42	tc qdisc del dev $swp2 clsact
43	simple_if_fini $swp2 192.0.2.2/24
44
45	tc qdisc del dev $swp1 clsact
46	simple_if_fini $swp1 192.0.2.2/24
47}
48
49shared_block_test()
50{
51	RET=0
52
53	tc filter add block 22 protocol ip pref 1 handle 101 flower \
54		$tcflags dst_ip 192.0.2.2 action drop
55
56	$MZ $h1 -c 1 -p 64 -a $h1mac -b $swmac -A 192.0.2.1 -B 192.0.2.2 \
57		-t ip -q
58
59	tc_check_packets "block 22" 101 1
60	check_err $? "Did not match first incoming packet on a block"
61
62	$MZ $h2 -c 1 -p 64 -a $h2mac -b $swmac -A 192.0.2.1 -B 192.0.2.2 \
63		-t ip -q
64
65	tc_check_packets "block 22" 101 2
66	check_err $? "Did not match second incoming packet on a block"
67
68	tc filter del block 22 protocol ip pref 1 handle 101 flower
69
70	log_test "shared block ($tcflags)"
71}
72
73match_indev_test()
74{
75	RET=0
76
77	tc filter add block 22 protocol ip pref 1 handle 101 flower \
78		$tcflags indev $swp1 dst_mac $swmac action drop
79	tc filter add block 22 protocol ip pref 2 handle 102 flower \
80		$tcflags indev $swp2 dst_mac $swmac action drop
81
82	$MZ $h1 -c 1 -p 64 -a $h1mac -b $swmac -A 192.0.2.1 -B 192.0.2.2 \
83		-t ip -q
84
85	tc_check_packets "block 22" 101 1
86	check_err $? "Did not match first incoming packet on a block"
87
88	$MZ $h2 -c 1 -p 64 -a $h2mac -b $swmac -A 192.0.2.1 -B 192.0.2.2 \
89		-t ip -q
90
91	tc_check_packets "block 22" 102 1
92	check_err $? "Did not match second incoming packet on a block"
93
94	tc filter del block 22 protocol ip pref 1 handle 101 flower
95	tc filter del block 22 protocol ip pref 2 handle 102 flower
96
97	log_test "indev match ($tcflags)"
98}
99
100setup_prepare()
101{
102	h1=${NETIFS[p1]}
103	swp1=${NETIFS[p2]}
104
105	swp2=${NETIFS[p3]}
106	h2=${NETIFS[p4]}
107
108	h1mac=$(mac_get $h1)
109	h2mac=$(mac_get $h2)
110
111	swmac=$(mac_get $swp1)
112	swp2origmac=$(mac_get $swp2)
113	ip link set $swp2 address $swmac
114
115	vrf_prepare
116
117	h1_create
118	h2_create
119	switch_create
120}
121
122cleanup()
123{
124	pre_cleanup
125
126	switch_destroy
127	h2_destroy
128	h1_destroy
129
130	vrf_cleanup
131
132	ip link set $swp2 address $swp2origmac
133}
134
135check_tc_shblock_support
136
137trap cleanup EXIT
138
139setup_prepare
140setup_wait
141
142tests_run
143
144tc_offload_check
145if [[ $? -ne 0 ]]; then
146	log_info "Could not test offloaded functionality"
147else
148	tcflags="skip_sw"
149	tests_run
150fi
151
152exit $EXIT_STATUS
153