1176730Sjeff#!/bin/bash
2176730Sjeff# SPDX-License-Identifier: GPL-2.0
3176730Sjeff
4176730Sjeff# +------------------------------------------------+   +----------------------+
5176730Sjeff# | H1 (vrf)                                       |   |             H2 (vrf) |
6176730Sjeff# |    + $h1.555           + $h1.777               |   |  + $h2               |
7176730Sjeff# |    | 192.0.2.1/28      | 192.0.2.17/28         |   |  | 192.0.2.130/28    |
8176730Sjeff# |    | 2001:db8:1::1/64  | 2001:db8:3::1/64      |   |  | 192.0.2.146/28    |
9176730Sjeff# |    | .-----------------'                       |   |  | 2001:db8:2::2/64  |
10176730Sjeff# |    |/                                          |   |  | 2001:db8:4::2/64  |
11176730Sjeff# |    + $h1                                       |   |  |                   |
12176730Sjeff# +----|-------------------------------------------+   +--|-------------------+
13176730Sjeff#      |                                                  |
14176730Sjeff# +----|--------------------------------------------------|-------------------+
15176730Sjeff# | SW |                                                  |                   |
16176730Sjeff# | +--|-------------------------------+                  + $swp2             |
17176730Sjeff# | |  + $swp1                         |                    192.0.2.129/28    |
18176730Sjeff# | |    vid 555 777                   |                    192.0.2.145/28    |
19176730Sjeff# | |                                  |                    2001:db8:2::1/64  |
20176730Sjeff# | |  + BR1 (802.1q)                  |                    2001:db8:4::1/64  |
21176730Sjeff# | |    vid 555 pvid untagged         |                                      |
22176730Sjeff# | |    192.0.2.2/28                  |                                      |
23176730Sjeff# | |    192.0.2.18/28                 |                                      |
24176730Sjeff# | |    2001:db8:1::2/64              |                                      |
25176730Sjeff# | |    2001:db8:3::2/64              |                                      |
26176730Sjeff# | +----------------------------------+                                      |
27176730Sjeff# +---------------------------------------------------------------------------+
28176730Sjeff
29176730SjeffALL_TESTS="
30176730Sjeff	ping_ipv4
31176730Sjeff	ping_ipv6
32176730Sjeff	vlan
33176730Sjeff	config_777
34176730Sjeff	ping_ipv4_fails
35176730Sjeff	ping_ipv6_fails
36176730Sjeff	ping_ipv4_777
37176730Sjeff	ping_ipv6_777
38176730Sjeff	config_555
39176730Sjeff	ping_ipv4
40176730Sjeff	ping_ipv6
41176730Sjeff"
42176730SjeffNUM_NETIFS=4
43176730Sjeffsource lib.sh
44176730Sjeff
45176730Sjeffh1_create()
46176730Sjeff{
47176730Sjeff	simple_if_init $h1
48176730Sjeff
49177738Sjeff	vlan_create $h1 555 v$h1 192.0.2.1/28 2001:db8:1::1/64
50177738Sjeff	ip -4 route add 192.0.2.128/28 vrf v$h1 nexthop via 192.0.2.2
51176730Sjeff	ip -6 route add 2001:db8:2::/64 vrf v$h1 nexthop via 2001:db8:1::2
52176730Sjeff
53176730Sjeff	vlan_create $h1 777 v$h1 192.0.2.17/28 2001:db8:3::1/64
54176730Sjeff	ip -4 route add 192.0.2.144/28 vrf v$h1 nexthop via 192.0.2.18
55176730Sjeff	ip -6 route add 2001:db8:4::/64 vrf v$h1 nexthop via 2001:db8:3::2
56176730Sjeff}
57176730Sjeff
58176730Sjeffh1_destroy()
59176730Sjeff{
60176730Sjeff	ip -6 route del 2001:db8:4::/64 vrf v$h1
61176730Sjeff	ip -4 route del 192.0.2.144/28 vrf v$h1
62176730Sjeff	vlan_destroy $h1 777
63176730Sjeff
64176730Sjeff	ip -6 route del 2001:db8:2::/64 vrf v$h1
65176730Sjeff	ip -4 route del 192.0.2.128/28 vrf v$h1
66176730Sjeff	vlan_destroy $h1 555
67176730Sjeff
68176730Sjeff	simple_if_fini $h1
69176730Sjeff}
70176730Sjeff
71176730Sjeffh2_create()
72176730Sjeff{
73176730Sjeff	simple_if_init $h2 192.0.2.130/28 2001:db8:2::2/64 \
74176730Sjeff			   192.0.2.146/28 2001:db8:4::2/64
75176730Sjeff	ip -4 route add 192.0.2.0/28 vrf v$h2 nexthop via 192.0.2.129
76176730Sjeff	ip -4 route add 192.0.2.16/28 vrf v$h2 nexthop via 192.0.2.145
77176730Sjeff	ip -6 route add 2001:db8:1::/64 vrf v$h2 nexthop via 2001:db8:2::1
78176730Sjeff	ip -6 route add 2001:db8:3::/64 vrf v$h2 nexthop via 2001:db8:4::1
79176730Sjeff}
80176730Sjeff
81176730Sjeffh2_destroy()
82176730Sjeff{
83176730Sjeff	ip -6 route del 2001:db8:3::/64 vrf v$h2
84176730Sjeff	ip -6 route del 2001:db8:1::/64 vrf v$h2
85176730Sjeff	ip -4 route del 192.0.2.16/28 vrf v$h2
86176730Sjeff	ip -4 route del 192.0.2.0/28 vrf v$h2
87176730Sjeff	simple_if_fini $h2 192.0.2.146/28 2001:db8:4::2/64 \
88176730Sjeff			   192.0.2.130/28 2001:db8:2::2/64
89176730Sjeff}
90176730Sjeff
91176730Sjeffrouter_create()
92176730Sjeff{
93176730Sjeff	ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0
94176730Sjeff	ip link set dev br1 up
95176730Sjeff
96176730Sjeff	ip link set dev $swp1 master br1
97176730Sjeff	ip link set dev $swp1 up
98176730Sjeff
99177738Sjeff	bridge vlan add dev br1 vid 555 self pvid untagged
100176730Sjeff	bridge vlan add dev $swp1 vid 555
101177738Sjeff	bridge vlan add dev $swp1 vid 777
102177738Sjeff
103176730Sjeff	__addr_add_del br1 add 192.0.2.2/28 2001:db8:1::2/64
104176730Sjeff	__addr_add_del br1 add 192.0.2.18/28 2001:db8:3::2/64
105176730Sjeff
106176730Sjeff	ip link set dev $swp2 up
107176730Sjeff	__addr_add_del $swp2 add 192.0.2.129/28 2001:db8:2::1/64
108176730Sjeff	__addr_add_del $swp2 add 192.0.2.145/28 2001:db8:4::1/64
109176730Sjeff}
110176730Sjeff
111176730Sjeffrouter_destroy()
112176730Sjeff{
113176730Sjeff	__addr_add_del $swp2 del 192.0.2.145/28 2001:db8:4::1/64
114176730Sjeff	__addr_add_del $swp2 del 192.0.2.129/28 2001:db8:2::1/64
115176730Sjeff	ip link set dev $swp2 down
116176730Sjeff
117176730Sjeff	__addr_add_del br1 del 192.0.2.18/28 2001:db8:3::2/64
118176730Sjeff	__addr_add_del br1 del 192.0.2.2/28 2001:db8:1::2/64
119176730Sjeff	ip link set dev $swp1 down
120176730Sjeff	ip link set dev $swp1 nomaster
121176730Sjeff
122176730Sjeff	ip link del dev br1
123176730Sjeff}
124176730Sjeff
125176730Sjeffsetup_prepare()
126176730Sjeff{
127176730Sjeff	h1=${NETIFS[p1]}
128176730Sjeff	swp1=${NETIFS[p2]}
129176730Sjeff
130176730Sjeff	swp2=${NETIFS[p3]}
131176730Sjeff	h2=${NETIFS[p4]}
132176730Sjeff
133176730Sjeff	vrf_prepare
134176730Sjeff
135176730Sjeff	h1_create
136176730Sjeff	h2_create
137176730Sjeff
138176730Sjeff	router_create
139176730Sjeff
140176730Sjeff	forwarding_enable
141176730Sjeff}
142176730Sjeff
143176730Sjeffconfig_555()
144176730Sjeff{
145176730Sjeff	log_info "Configure VLAN 555 as PVID"
146176730Sjeff
147176730Sjeff	bridge vlan add dev br1 vid 555 self pvid untagged
148176730Sjeff	bridge vlan del dev br1 vid 777 self
149176730Sjeff	sleep 2
150176730Sjeff}
151176730Sjeff
152176730Sjeffconfig_777()
153176730Sjeff{
154176730Sjeff	log_info "Configure VLAN 777 as PVID"
155176730Sjeff
156176730Sjeff	bridge vlan add dev br1 vid 777 self pvid untagged
157176730Sjeff	bridge vlan del dev br1 vid 555 self
158176730Sjeff	sleep 2
159176730Sjeff}
160176730Sjeff
161176730Sjeffcleanup()
162176730Sjeff{
163176730Sjeff	pre_cleanup
164176730Sjeff
165176730Sjeff	forwarding_restore
166176730Sjeff
167176730Sjeff	router_destroy
168176730Sjeff
169176730Sjeff	h2_destroy
170176730Sjeff	h1_destroy
171176730Sjeff
172176730Sjeff	vrf_cleanup
173176730Sjeff}
174176730Sjeff
175176730Sjeffvlan()
176176730Sjeff{
177176730Sjeff	RET=0
178176730Sjeff
179176730Sjeff	bridge vlan add dev br1 vid 333 self
180176730Sjeff	check_err $? "Can't add a non-PVID VLAN"
181176730Sjeff	bridge vlan del dev br1 vid 333 self
182176730Sjeff	check_err $? "Can't remove a non-PVID VLAN"
183176730Sjeff
184176730Sjeff	log_test "vlan"
185176730Sjeff}
186176730Sjeff
187176730Sjeffping_ipv4()
188176730Sjeff{
189176730Sjeff	ping_test $h1.555 192.0.2.130
190176730Sjeff}
191176730Sjeff
192176730Sjeffping_ipv6()
193176730Sjeff{
194176730Sjeff	ping6_test $h1.555 2001:db8:2::2
195176730Sjeff}
196176811Sjeff
197176811Sjeffping_ipv4_fails()
198176730Sjeff{
199176730Sjeff	ping_test_fails $h1.555 192.0.2.130 ": via 555"
200176730Sjeff}
201176730Sjeff
202176730Sjeffping_ipv6_fails()
203176730Sjeff{
204176811Sjeff	ping6_test_fails $h1.555 2001:db8:2::2 ": via 555"
205176811Sjeff}
206176811Sjeff
207176811Sjeffping_ipv4_777()
208176811Sjeff{
209176730Sjeff	ping_test $h1.777 192.0.2.146 ": via 777"
210176730Sjeff}
211176811Sjeff
212176730Sjeffping_ipv6_777()
213176730Sjeff{
214176730Sjeff	ping6_test $h1.777 2001:db8:4::2 ": via 777"
215176730Sjeff}
216176730Sjeff
217176730Sjefftrap cleanup EXIT
218176730Sjeff
219176730Sjeffsetup_prepare
220176730Sjeffsetup_wait
221176730Sjeff
222176730Sjefftests_run
223176730Sjeff
224176730Sjeffexit $EXIT_STATUS
225176730Sjeff