1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# +------------------------+                           +----------------------+
5# | H1 (vrf)               |                           |             H2 (vrf) |
6# |    + $h1               |                           |  + $h2               |
7# |    | 192.0.2.1/28      |                           |  | 192.0.2.130/28    |
8# |    | 2001:db8:1::1/64  |                           |  | 2001:db8:2::2/64  |
9# |    |                   |                           |  |                   |
10# +----|-------------------+                           +--|-------------------+
11#      |                                                  |
12# +----|--------------------------------------------------|-------------------+
13# | SW |                                                  |                   |
14# | +--|-----------------------------+                    + $swp2             |
15# | |  + $swp1      BR1 (802.1q)     |                      192.0.2.129/28    |
16# | |               192.0.2.2/28     |                      2001:db8:2::1/64  |
17# | |               2001:db8:1::1/64 |                                        |
18# | |                                |                                        |
19# | +--------------------------------+                                        |
20# +---------------------------------------------------------------------------+
21
22ALL_TESTS="
23	ping_ipv4
24	ping_ipv6
25	config_remaster
26	ping_ipv4
27	ping_ipv6
28	config_remove_pvid
29	ping_ipv4_fails
30	ping_ipv6_fails
31	config_add_pvid
32	ping_ipv4
33	ping_ipv6
34	config_late_pvid
35	ping_ipv4
36	ping_ipv6
37"
38NUM_NETIFS=4
39source lib.sh
40
41h1_create()
42{
43	simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64
44	ip -4 route add 192.0.2.128/28 vrf v$h1 nexthop via 192.0.2.2
45	ip -6 route add 2001:db8:2::/64 vrf v$h1 nexthop via 2001:db8:1::2
46}
47
48h1_destroy()
49{
50	ip -6 route del 2001:db8:2::/64 vrf v$h1
51	ip -4 route del 192.0.2.128/28 vrf v$h1
52	simple_if_fini $h1 192.0.2.1/28 2001:db8:1::1/64
53}
54
55h2_create()
56{
57	simple_if_init $h2 192.0.2.130/28 2001:db8:2::2/64
58	ip -4 route add 192.0.2.0/28 vrf v$h2 nexthop via 192.0.2.129
59	ip -6 route add 2001:db8:1::/64 vrf v$h2 nexthop via 2001:db8:2::1
60}
61
62h2_destroy()
63{
64	ip -6 route del 2001:db8:1::/64 vrf v$h2
65	ip -4 route del 192.0.2.0/28 vrf v$h2
66	simple_if_fini $h2 192.0.2.130/28 2001:db8:2::2/64
67}
68
69router_create()
70{
71	ip link add name br1 address $(mac_get $swp1) \
72		type bridge vlan_filtering 1
73	ip link set dev br1 up
74
75	ip link set dev $swp1 master br1
76	ip link set dev $swp1 up
77	__addr_add_del br1 add 192.0.2.2/28 2001:db8:1::2/64
78
79	ip link set dev $swp2 up
80	__addr_add_del $swp2 add 192.0.2.129/28 2001:db8:2::1/64
81}
82
83router_destroy()
84{
85	__addr_add_del $swp2 del 192.0.2.129/28 2001:db8:2::1/64
86	ip link set dev $swp2 down
87
88	__addr_add_del br1 del 192.0.2.2/28 2001:db8:1::2/64
89	ip link set dev $swp1 down
90	ip link set dev $swp1 nomaster
91
92	ip link del dev br1
93}
94
95config_remaster()
96{
97	log_info "Remaster bridge slave"
98
99	ip link set dev $swp1 nomaster
100	sleep 2
101	ip link set dev $swp1 master br1
102}
103
104config_remove_pvid()
105{
106	log_info "Remove PVID from the bridge"
107
108	bridge vlan add dev br1 vid 1 self
109	sleep 2
110}
111
112config_add_pvid()
113{
114	log_info "Add PVID to the bridge"
115
116	bridge vlan add dev br1 vid 1 self pvid untagged
117	sleep 2
118}
119
120config_late_pvid()
121{
122	log_info "Add bridge PVID after enslaving port"
123
124	ip link set dev $swp1 nomaster
125	ip link set dev br1 type bridge vlan_default_pvid 0
126	sleep 2
127	ip link set dev $swp1 master br1
128	ip link set dev br1 type bridge vlan_default_pvid 1
129}
130
131setup_prepare()
132{
133	h1=${NETIFS[p1]}
134	swp1=${NETIFS[p2]}
135
136	swp2=${NETIFS[p3]}
137	h2=${NETIFS[p4]}
138
139	vrf_prepare
140
141	h1_create
142	h2_create
143
144	router_create
145
146	forwarding_enable
147}
148
149cleanup()
150{
151	pre_cleanup
152
153	forwarding_restore
154
155	router_destroy
156
157	h2_destroy
158	h1_destroy
159
160	vrf_cleanup
161}
162
163ping_ipv4()
164{
165	ping_test $h1 192.0.2.130
166}
167
168ping_ipv6()
169{
170	ping6_test $h1 2001:db8:2::2
171}
172
173ping_ipv4_fails()
174{
175	ping_test_fails $h1 192.0.2.130
176}
177
178ping_ipv6_fails()
179{
180	ping6_test_fails $h1 2001:db8:2::2
181}
182
183trap cleanup EXIT
184
185setup_prepare
186setup_wait
187
188tests_run
189
190exit $EXIT_STATUS
191