1*9cbb3da4SPetr Machata#!/bin/bash
2*9cbb3da4SPetr Machata# SPDX-License-Identifier: GPL-2.0
3*9cbb3da4SPetr Machata
4*9cbb3da4SPetr Machata# +----------------------------+
5*9cbb3da4SPetr Machata# |                   H1 (vrf) |
6*9cbb3da4SPetr Machata# |   + $h1.10                 |                      +----------------------+
7*9cbb3da4SPetr Machata# |   | 192.0.2.1/28           |                      |             H2 (vrf) |
8*9cbb3da4SPetr Machata# |   | 2001:db8:1::1/64       |                      |  + $h2               |
9*9cbb3da4SPetr Machata# |   |                        |                      |  | 192.0.2.130/28    |
10*9cbb3da4SPetr Machata# |   + $h1                    |                      |  | 2001:db8:2::2/64  |
11*9cbb3da4SPetr Machata# +---|------------------------+                      +--|-------------------+
12*9cbb3da4SPetr Machata#     |                                                  |
13*9cbb3da4SPetr Machata# +---|--------------------------------------------------|-------------------+
14*9cbb3da4SPetr Machata# |   |                            router (main VRF)     |                   |
15*9cbb3da4SPetr Machata# | +-|----------------------------------+               + $swp2             |
16*9cbb3da4SPetr Machata# | | + $swp1      BR1 (802.1q, pvid=10) |                 192.0.2.129/28    |
17*9cbb3da4SPetr Machata# | |              192.0.2.2/28          |                 2001:db8:2::1/64  |
18*9cbb3da4SPetr Machata# | |              2001:db8:1::2/64      |                                   |
19*9cbb3da4SPetr Machata# | +------------------------------------+                                   |
20*9cbb3da4SPetr Machata# +--------------------------------------------------------------------------+
21*9cbb3da4SPetr Machata
22*9cbb3da4SPetr MachataALL_TESTS="
23*9cbb3da4SPetr Machata	ping_ipv4
24*9cbb3da4SPetr Machata	ping_ipv6
25*9cbb3da4SPetr Machata	shuffle_pvid
26*9cbb3da4SPetr Machata	ping_ipv4
27*9cbb3da4SPetr Machata	ping_ipv6
28*9cbb3da4SPetr Machata"
29*9cbb3da4SPetr MachataNUM_NETIFS=4
30*9cbb3da4SPetr Machatasource lib.sh
31*9cbb3da4SPetr Machata
32*9cbb3da4SPetr Machatah1_create()
33*9cbb3da4SPetr Machata{
34*9cbb3da4SPetr Machata	simple_if_init $h1
35*9cbb3da4SPetr Machata	vlan_create $h1 10 v$h1 192.0.2.1/28 2001:db8:1::1/64
36*9cbb3da4SPetr Machata	ip -4 route add 192.0.2.128/28 vrf v$h1 nexthop via 192.0.2.2
37*9cbb3da4SPetr Machata	ip -6 route add 2001:db8:2::/64 vrf v$h1 nexthop via 2001:db8:1::2
38*9cbb3da4SPetr Machata}
39*9cbb3da4SPetr Machata
40*9cbb3da4SPetr Machatah1_destroy()
41*9cbb3da4SPetr Machata{
42*9cbb3da4SPetr Machata	ip -6 route del 2001:db8:2::/64 vrf v$h1
43*9cbb3da4SPetr Machata	ip -4 route del 192.0.2.128/28 vrf v$h1
44*9cbb3da4SPetr Machata	vlan_destroy $h1 10
45*9cbb3da4SPetr Machata	simple_if_fini $h1
46*9cbb3da4SPetr Machata}
47*9cbb3da4SPetr Machata
48*9cbb3da4SPetr Machatah2_create()
49*9cbb3da4SPetr Machata{
50*9cbb3da4SPetr Machata	simple_if_init $h2 192.0.2.130/28 2001:db8:2::2/64
51*9cbb3da4SPetr Machata	ip -4 route add 192.0.2.0/28 vrf v$h2 nexthop via 192.0.2.129
52*9cbb3da4SPetr Machata	ip -6 route add 2001:db8:1::/64 vrf v$h2 nexthop via 2001:db8:2::1
53*9cbb3da4SPetr Machata}
54*9cbb3da4SPetr Machata
55*9cbb3da4SPetr Machatah2_destroy()
56*9cbb3da4SPetr Machata{
57*9cbb3da4SPetr Machata	ip -6 route del 2001:db8:1::/64 vrf v$h2
58*9cbb3da4SPetr Machata	ip -4 route del 192.0.2.0/28 vrf v$h2
59*9cbb3da4SPetr Machata	simple_if_fini $h2 192.0.2.130/28 2001:db8:2::2/64
60*9cbb3da4SPetr Machata}
61*9cbb3da4SPetr Machata
62*9cbb3da4SPetr Machatarouter_create()
63*9cbb3da4SPetr Machata{
64*9cbb3da4SPetr Machata	ip link add name br1 address $(mac_get $swp1) \
65*9cbb3da4SPetr Machata		type bridge vlan_filtering 1 vlan_default_pvid 0
66*9cbb3da4SPetr Machata	ip link set dev br1 up
67*9cbb3da4SPetr Machata	__addr_add_del br1 add 192.0.2.2/28 2001:db8:1::2/64
68*9cbb3da4SPetr Machata
69*9cbb3da4SPetr Machata	ip link set dev $swp1 master br1
70*9cbb3da4SPetr Machata	ip link set dev $swp1 up
71*9cbb3da4SPetr Machata
72*9cbb3da4SPetr Machata	ip link set dev $swp2 up
73*9cbb3da4SPetr Machata	__addr_add_del $swp2 add 192.0.2.129/28 2001:db8:2::1/64
74*9cbb3da4SPetr Machata
75*9cbb3da4SPetr Machata	bridge vlan add dev br1 vid 10 pvid untagged self
76*9cbb3da4SPetr Machata	bridge vlan add dev $swp1 vid 10
77*9cbb3da4SPetr Machata}
78*9cbb3da4SPetr Machata
79*9cbb3da4SPetr Machatarouter_destroy()
80*9cbb3da4SPetr Machata{
81*9cbb3da4SPetr Machata	bridge vlan del dev $swp1 vid 10
82*9cbb3da4SPetr Machata	bridge vlan del dev br1 vid 10 self
83*9cbb3da4SPetr Machata
84*9cbb3da4SPetr Machata	__addr_add_del $swp2 del 192.0.2.129/28 2001:db8:2::1/64
85*9cbb3da4SPetr Machata	ip link set dev $swp2 down
86*9cbb3da4SPetr Machata
87*9cbb3da4SPetr Machata	ip link set dev $swp1 down
88*9cbb3da4SPetr Machata	ip link set dev $swp1 nomaster
89*9cbb3da4SPetr Machata
90*9cbb3da4SPetr Machata	__addr_add_del br1 del 192.0.2.2/28 2001:db8:1::2/64
91*9cbb3da4SPetr Machata	ip link del dev br1
92*9cbb3da4SPetr Machata}
93*9cbb3da4SPetr Machata
94*9cbb3da4SPetr Machatasetup_prepare()
95*9cbb3da4SPetr Machata{
96*9cbb3da4SPetr Machata	h1=${NETIFS[p1]}
97*9cbb3da4SPetr Machata	swp1=${NETIFS[p2]}
98*9cbb3da4SPetr Machata
99*9cbb3da4SPetr Machata	swp2=${NETIFS[p3]}
100*9cbb3da4SPetr Machata	h2=${NETIFS[p4]}
101*9cbb3da4SPetr Machata
102*9cbb3da4SPetr Machata	vrf_prepare
103*9cbb3da4SPetr Machata
104*9cbb3da4SPetr Machata	h1_create
105*9cbb3da4SPetr Machata	h2_create
106*9cbb3da4SPetr Machata
107*9cbb3da4SPetr Machata	router_create
108*9cbb3da4SPetr Machata
109*9cbb3da4SPetr Machata	forwarding_enable
110*9cbb3da4SPetr Machata}
111*9cbb3da4SPetr Machata
112*9cbb3da4SPetr Machatashuffle_pvid()
113*9cbb3da4SPetr Machata{
114*9cbb3da4SPetr Machata	log_info "Add and remove VLAN upper for PVID VLAN"
115*9cbb3da4SPetr Machata
116*9cbb3da4SPetr Machata	# Adding and removing a VLAN upper for the PVID VLAN shouldn't change
117*9cbb3da4SPetr Machata	# anything. The address is arbitrary, just to make sure it will be an L3
118*9cbb3da4SPetr Machata	# netdevice.
119*9cbb3da4SPetr Machata	vlan_create br1 10 "" 192.0.2.33/28
120*9cbb3da4SPetr Machata	sleep 1
121*9cbb3da4SPetr Machata	vlan_destroy br1 10
122*9cbb3da4SPetr Machata}
123*9cbb3da4SPetr Machata
124*9cbb3da4SPetr Machatacleanup()
125*9cbb3da4SPetr Machata{
126*9cbb3da4SPetr Machata	pre_cleanup
127*9cbb3da4SPetr Machata
128*9cbb3da4SPetr Machata	forwarding_restore
129*9cbb3da4SPetr Machata
130*9cbb3da4SPetr Machata	router_destroy
131*9cbb3da4SPetr Machata
132*9cbb3da4SPetr Machata	h2_destroy
133*9cbb3da4SPetr Machata	h1_destroy
134*9cbb3da4SPetr Machata
135*9cbb3da4SPetr Machata	vrf_cleanup
136*9cbb3da4SPetr Machata}
137*9cbb3da4SPetr Machata
138*9cbb3da4SPetr Machataping_ipv4()
139*9cbb3da4SPetr Machata{
140*9cbb3da4SPetr Machata	ping_test $h1 192.0.2.130
141*9cbb3da4SPetr Machata}
142*9cbb3da4SPetr Machata
143*9cbb3da4SPetr Machataping_ipv6()
144*9cbb3da4SPetr Machata{
145*9cbb3da4SPetr Machata	ping6_test $h1 2001:db8:2::2
146*9cbb3da4SPetr Machata}
147*9cbb3da4SPetr Machata
148*9cbb3da4SPetr Machatatrap cleanup EXIT
149*9cbb3da4SPetr Machata
150*9cbb3da4SPetr Machatasetup_prepare
151*9cbb3da4SPetr Machatasetup_wait
152*9cbb3da4SPetr Machata
153*9cbb3da4SPetr Machatatests_run
154*9cbb3da4SPetr Machata
155*9cbb3da4SPetr Machataexit $EXIT_STATUS
156