File Index
Files and directories
Sign in
FILE

no_forwarding.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/forwarding/no_forwarding.sh BASH
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0
  3
  4ALL_TESTS="standalone two_bridges one_bridge_two_pvids"
  5NUM_NETIFS=4
  6
  7source lib.sh
  8
  9h1=${NETIFS[p1]}
 10h2=${NETIFS[p3]}
 11swp1=${NETIFS[p2]}
 12swp2=${NETIFS[p4]}
 13
 14H1_IPV4="192.0.2.1"
 15H2_IPV4="192.0.2.2"
 16H1_IPV6="2001:db8:1::1"
 17H2_IPV6="2001:db8:1::2"
 18
 19IPV4_ALLNODES="224.0.0.1"
 20IPV6_ALLNODES="ff02::1"
 21MACV4_ALLNODES="01:00:5e:00:00:01"
 22MACV6_ALLNODES="33:33:00:00:00:01"
 23NON_IP_MC="01:02:03:04:05:06"
 24NON_IP_PKT="00:04 48:45:4c:4f"
 25BC="ff:ff:ff:ff:ff:ff"
 26
 27# The full 4K VLAN space is too much to check, so strategically pick some
 28# values which should provide reasonable coverage
 29vids=(0 1 2 5 10 20 50 100 200 500 1000 1000 2000 4000 4094)
 30
 31send_non_ip()
 32{
 33	local if_name=$1
 34	local smac=$2
 35	local dmac=$3
 36
 37	$MZ -q $if_name "$dmac $smac $NON_IP_PKT"
 38}
 39
 40send_uc_ipv4()
 41{
 42	local if_name=$1
 43	local dmac=$2
 44
 45	ip neigh add $H2_IPV4 lladdr $dmac dev $if_name
 46	ping_do $if_name $H2_IPV4
 47	ip neigh del $H2_IPV4 dev $if_name
 48}
 49
 50send_mc_ipv4()
 51{
 52	local if_name=$1
 53
 54	ping_do $if_name $IPV4_ALLNODES "-I $if_name"
 55}
 56
 57send_uc_ipv6()
 58{
 59	local if_name=$1
 60	local dmac=$2
 61
 62	ip -6 neigh add $H2_IPV6 lladdr $dmac dev $if_name
 63	ping6_do $if_name $H2_IPV6
 64	ip -6 neigh del $H2_IPV6 dev $if_name
 65}
 66
 67send_mc_ipv6()
 68{
 69	local if_name=$1
 70
 71	ping6_do $if_name $IPV6_ALLNODES%$if_name
 72}
 73
 74check_rcv()
 75{
 76	local if_name=$1
 77	local type=$2
 78	local pattern=$3
 79	local should_fail=1
 80
 81	RET=0
 82
 83	tcpdump_show $if_name | grep -q "$pattern"
 84
 85	check_err_fail "$should_fail" "$?" "reception"
 86
 87	log_test "$type"
 88}
 89
 90run_test()
 91{
 92	local test_name="$1"
 93	local smac=$(mac_get $h1)
 94	local dmac=$(mac_get $h2)
 95	local h1_ipv6_lladdr=$(ipv6_lladdr_get $h1)
 96	local vid=
 97
 98	echo "$test_name: Sending packets"
 99
100	tcpdump_start $h2
101
102	send_non_ip $h1 $smac $dmac
103	send_non_ip $h1 $smac $NON_IP_MC
104	send_non_ip $h1 $smac $BC
105	send_uc_ipv4 $h1 $dmac
106	send_mc_ipv4 $h1
107	send_uc_ipv6 $h1 $dmac
108	send_mc_ipv6 $h1
109
110	for vid in "${vids[@]}"; do
111		vlan_create $h1 $vid
112		simple_if_init $h1.$vid $H1_IPV4/24 $H1_IPV6/64
113
114		send_non_ip $h1.$vid $smac $dmac
115		send_non_ip $h1.$vid $smac $NON_IP_MC
116		send_non_ip $h1.$vid $smac $BC
117		send_uc_ipv4 $h1.$vid $dmac
118		send_mc_ipv4 $h1.$vid
119		send_uc_ipv6 $h1.$vid $dmac
120		send_mc_ipv6 $h1.$vid
121
122		simple_if_fini $h1.$vid $H1_IPV4/24 $H1_IPV6/64
123		vlan_destroy $h1 $vid
124	done
125
126	sleep 1
127
128	echo "$test_name: Checking which packets were received"
129
130	tcpdump_stop $h2
131
132	check_rcv $h2 "$test_name: Unicast non-IP untagged" \
133		"$smac > $dmac, 802.3, length 4:"
134
135	check_rcv $h2 "$test_name: Multicast non-IP untagged" \
136		"$smac > $NON_IP_MC, 802.3, length 4:"
137
138	check_rcv $h2 "$test_name: Broadcast non-IP untagged" \
139		"$smac > $BC, 802.3, length 4:"
140
141	check_rcv $h2 "$test_name: Unicast IPv4 untagged" \
142		"$smac > $dmac, ethertype IPv4 (0x0800)"
143
144	check_rcv $h2 "$test_name: Multicast IPv4 untagged" \
145		"$smac > $MACV4_ALLNODES, ethertype IPv4 (0x0800).*: $H1_IPV4 > $IPV4_ALLNODES"
146
147	check_rcv $h2 "$test_name: Unicast IPv6 untagged" \
148		"$smac > $dmac, ethertype IPv6 (0x86dd).*8: $H1_IPV6 > $H2_IPV6"
149
150	check_rcv $h2 "$test_name: Multicast IPv6 untagged" \
151		"$smac > $MACV6_ALLNODES, ethertype IPv6 (0x86dd).*: $h1_ipv6_lladdr > $IPV6_ALLNODES"
152
153	for vid in "${vids[@]}"; do
154		check_rcv $h2 "$test_name: Unicast non-IP VID $vid" \
155			"$smac > $dmac, ethertype 802.1Q (0x8100).*vlan $vid,.*length 4"
156
157		check_rcv $h2 "$test_name: Multicast non-IP VID $vid" \
158			"$smac > $NON_IP_MC, ethertype 802.1Q (0x8100).*vlan $vid,.*length 4"
159
160		check_rcv $h2 "$test_name: Broadcast non-IP VID $vid" \
161			"$smac > $BC, ethertype 802.1Q (0x8100).*vlan $vid,.*length 4"
162
163		check_rcv $h2 "$test_name: Unicast IPv4 VID $vid" \
164			"$smac > $dmac, ethertype 802.1Q (0x8100).*vlan $vid,.*ethertype IPv4 (0x0800), $H1_IPV4 > $H2_IPV4"
165
166		check_rcv $h2 "$test_name: Multicast IPv4 VID $vid" \
167			"$smac > $MACV4_ALLNODES, ethertype 802.1Q (0x8100).*vlan $vid,.*ethertype IPv4 (0x0800), $H1_IPV4 > $IPV4_ALLNODES"
168
169		check_rcv $h2 "$test_name: Unicast IPv6 VID $vid" \
170			"$smac > $dmac, ethertype 802.1Q (0x8100).*vlan $vid,.*ethertype IPv6 (0x86dd), $H1_IPV6 > $H2_IPV6"
171
172		check_rcv $h2 "$test_name: Multicast IPv6 VID $vid" \
173			"$smac > $MACV6_ALLNODES, ethertype 802.1Q (0x8100).*vlan $vid,.*ethertype IPv6 (0x86dd), $h1_ipv6_lladdr > $IPV6_ALLNODES"
174	done
175
176	tcpdump_cleanup $h2
177}
178
179standalone()
180{
181	run_test "Standalone switch ports"
182}
183
184two_bridges()
185{
186	ip link add br0 type bridge && ip link set br0 up
187	ip link add br1 type bridge && ip link set br1 up
188	ip link set $swp1 master br0
189	ip link set $swp2 master br1
190
191	run_test "Switch ports in different bridges"
192
193	ip link del br1
194	ip link del br0
195}
196
197one_bridge_two_pvids()
198{
199	ip link add br0 type bridge vlan_filtering 1 vlan_default_pvid 0
200	ip link set br0 up
201	ip link set $swp1 master br0
202	ip link set $swp2 master br0
203
204	bridge vlan add dev $swp1 vid 1 pvid untagged
205	bridge vlan add dev $swp2 vid 2 pvid untagged
206
207	run_test "Switch ports in VLAN-aware bridge with different PVIDs"
208
209	ip link del br0
210}
211
212h1_create()
213{
214	simple_if_init $h1 $H1_IPV4/24 $H1_IPV6/64
215}
216
217h1_destroy()
218{
219	simple_if_fini $h1 $H1_IPV4/24 $H1_IPV6/64
220}
221
222h2_create()
223{
224	simple_if_init $h2 $H2_IPV4/24 $H2_IPV6/64
225}
226
227h2_destroy()
228{
229	simple_if_fini $h2 $H2_IPV4/24 $H2_IPV6/64
230}
231
232cleanup()
233{
234	pre_cleanup
235
236	ip link set dev $swp2 down
237	ip link set dev $swp1 down
238
239	h2_destroy
240	h1_destroy
241
242	vrf_cleanup
243}
244
245setup_prepare()
246{
247	vrf_prepare
248
249	h1_create
250	h2_create
251	# we call simple_if_init from the test itself, but setup_wait expects
252	# that we call it from here, and waits until the interfaces are up
253	ip link set dev $swp1 up
254	ip link set dev $swp2 up
255}
256
257trap cleanup EXIT
258
259setup_prepare
260setup_wait
261
262tests_run
263
264exit $EXIT_STATUS
~/ Read-only file preview.