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