1e96fa54bSIdo Schimmel#!/bin/bash
2e96fa54bSIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3e96fa54bSIdo Schimmel
4*74ddac07SPetr Machata# +-------------------------+  +-------------------------+
5*74ddac07SPetr Machata# | H1                      |  |                      H2 |
6*74ddac07SPetr Machata# |               $h1 +     |  |               $h2 +     |
7*74ddac07SPetr Machata# |      192.0.2.2/24 |     |  |   198.51.100.2/24 |     |
8*74ddac07SPetr Machata# |  2001:db8:1::2/64 |     |  |  2001:db8:2::2/64 |     |
9*74ddac07SPetr Machata# +-------------------|-----+  +-------------------|-----+
10*74ddac07SPetr Machata#                     |                            |
11*74ddac07SPetr Machata# +-------------------|----------------------------|-----+
12*74ddac07SPetr Machata# | R1                |                            |     |
13*74ddac07SPetr Machata# |              $rp1 +                       $rp2 +     |
14*74ddac07SPetr Machata# |      192.0.2.1/24              198.51.100.1/24       |
15*74ddac07SPetr Machata# |  2001:db8:1::1/64             2001:db8:2::1/64       |
16*74ddac07SPetr Machata# +------------------------------------------------------+
17*74ddac07SPetr Machata
18e96fa54bSIdo SchimmelALL_TESTS="
19e96fa54bSIdo Schimmel	ping_ipv4
20e96fa54bSIdo Schimmel	ping_ipv6
21e96fa54bSIdo Schimmel"
22e96fa54bSIdo Schimmel
23e96fa54bSIdo SchimmelNUM_NETIFS=4
24e96fa54bSIdo Schimmelsource lib.sh
25e96fa54bSIdo Schimmelsource tc_common.sh
26e96fa54bSIdo Schimmel
27e96fa54bSIdo Schimmelh1_create()
28e96fa54bSIdo Schimmel{
29e96fa54bSIdo Schimmel	vrf_create "vrf-h1"
30e96fa54bSIdo Schimmel	ip link set dev $h1 master vrf-h1
31e96fa54bSIdo Schimmel
32e96fa54bSIdo Schimmel	ip link set dev vrf-h1 up
33e96fa54bSIdo Schimmel	ip link set dev $h1 up
34e96fa54bSIdo Schimmel
35e96fa54bSIdo Schimmel	ip address add 192.0.2.2/24 dev $h1
36e96fa54bSIdo Schimmel	ip address add 2001:db8:1::2/64 dev $h1
37e96fa54bSIdo Schimmel
38e96fa54bSIdo Schimmel	ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
39e96fa54bSIdo Schimmel	ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
40e96fa54bSIdo Schimmel}
41e96fa54bSIdo Schimmel
42e96fa54bSIdo Schimmelh1_destroy()
43e96fa54bSIdo Schimmel{
44e96fa54bSIdo Schimmel	ip route del 2001:db8:2::/64 vrf vrf-h1
45e96fa54bSIdo Schimmel	ip route del 198.51.100.0/24 vrf vrf-h1
46e96fa54bSIdo Schimmel
47e96fa54bSIdo Schimmel	ip address del 2001:db8:1::2/64 dev $h1
48e96fa54bSIdo Schimmel	ip address del 192.0.2.2/24 dev $h1
49e96fa54bSIdo Schimmel
50e96fa54bSIdo Schimmel	ip link set dev $h1 down
51e96fa54bSIdo Schimmel	vrf_destroy "vrf-h1"
52e96fa54bSIdo Schimmel}
53e96fa54bSIdo Schimmel
54e96fa54bSIdo Schimmelh2_create()
55e96fa54bSIdo Schimmel{
56e96fa54bSIdo Schimmel	vrf_create "vrf-h2"
57e96fa54bSIdo Schimmel	ip link set dev $h2 master vrf-h2
58e96fa54bSIdo Schimmel
59e96fa54bSIdo Schimmel	ip link set dev vrf-h2 up
60e96fa54bSIdo Schimmel	ip link set dev $h2 up
61e96fa54bSIdo Schimmel
62e96fa54bSIdo Schimmel	ip address add 198.51.100.2/24 dev $h2
63e96fa54bSIdo Schimmel	ip address add 2001:db8:2::2/64 dev $h2
64e96fa54bSIdo Schimmel
65e96fa54bSIdo Schimmel	ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
66e96fa54bSIdo Schimmel	ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
67e96fa54bSIdo Schimmel}
68e96fa54bSIdo Schimmel
69e96fa54bSIdo Schimmelh2_destroy()
70e96fa54bSIdo Schimmel{
71e96fa54bSIdo Schimmel	ip route del 2001:db8:1::/64 vrf vrf-h2
72e96fa54bSIdo Schimmel	ip route del 192.0.2.0/24 vrf vrf-h2
73e96fa54bSIdo Schimmel
74e96fa54bSIdo Schimmel	ip address del 2001:db8:2::2/64 dev $h2
75e96fa54bSIdo Schimmel	ip address del 198.51.100.2/24 dev $h2
76e96fa54bSIdo Schimmel
77e96fa54bSIdo Schimmel	ip link set dev $h2 down
78e96fa54bSIdo Schimmel	vrf_destroy "vrf-h2"
79e96fa54bSIdo Schimmel}
80e96fa54bSIdo Schimmel
81e96fa54bSIdo Schimmelrouter_create()
82e96fa54bSIdo Schimmel{
83e96fa54bSIdo Schimmel	ip link set dev $rp1 up
84e96fa54bSIdo Schimmel	ip link set dev $rp2 up
85e96fa54bSIdo Schimmel
86e96fa54bSIdo Schimmel	tc qdisc add dev $rp2 clsact
87e96fa54bSIdo Schimmel
88e96fa54bSIdo Schimmel	ip address add 192.0.2.1/24 dev $rp1
89e96fa54bSIdo Schimmel	ip address add 2001:db8:1::1/64 dev $rp1
90e96fa54bSIdo Schimmel
91e96fa54bSIdo Schimmel	ip address add 198.51.100.1/24 dev $rp2
92e96fa54bSIdo Schimmel	ip address add 2001:db8:2::1/64 dev $rp2
93e96fa54bSIdo Schimmel}
94e96fa54bSIdo Schimmel
95e96fa54bSIdo Schimmelrouter_destroy()
96e96fa54bSIdo Schimmel{
97e96fa54bSIdo Schimmel	ip address del 2001:db8:2::1/64 dev $rp2
98e96fa54bSIdo Schimmel	ip address del 198.51.100.1/24 dev $rp2
99e96fa54bSIdo Schimmel
100e96fa54bSIdo Schimmel	ip address del 2001:db8:1::1/64 dev $rp1
101e96fa54bSIdo Schimmel	ip address del 192.0.2.1/24 dev $rp1
102e96fa54bSIdo Schimmel
103e96fa54bSIdo Schimmel	tc qdisc del dev $rp2 clsact
104e96fa54bSIdo Schimmel
105e96fa54bSIdo Schimmel	ip link set dev $rp2 down
106e96fa54bSIdo Schimmel	ip link set dev $rp1 down
107e96fa54bSIdo Schimmel}
108e96fa54bSIdo Schimmel
109e96fa54bSIdo Schimmelrouting_nh_obj()
110e96fa54bSIdo Schimmel{
111e96fa54bSIdo Schimmel	# Create the nexthops as AF_INET6, so that IPv4 and IPv6 routes could
112e96fa54bSIdo Schimmel	# use them.
113e96fa54bSIdo Schimmel	ip -6 nexthop add id 101 dev $rp1
114e96fa54bSIdo Schimmel	ip -6 nexthop add id 102 dev $rp2
115e96fa54bSIdo Schimmel
116e96fa54bSIdo Schimmel	ip route replace 192.0.2.0/24 nhid 101
117e96fa54bSIdo Schimmel	ip route replace 2001:db8:1::/64 nhid 101
118e96fa54bSIdo Schimmel	ip route replace 198.51.100.0/24 nhid 102
119e96fa54bSIdo Schimmel	ip route replace 2001:db8:2::/64 nhid 102
120e96fa54bSIdo Schimmel}
121e96fa54bSIdo Schimmel
122e96fa54bSIdo Schimmelsetup_prepare()
123e96fa54bSIdo Schimmel{
124e96fa54bSIdo Schimmel	h1=${NETIFS[p1]}
125e96fa54bSIdo Schimmel	rp1=${NETIFS[p2]}
126e96fa54bSIdo Schimmel
127e96fa54bSIdo Schimmel	rp2=${NETIFS[p3]}
128e96fa54bSIdo Schimmel	h2=${NETIFS[p4]}
129e96fa54bSIdo Schimmel
130e96fa54bSIdo Schimmel	rp1mac=$(mac_get $rp1)
131e96fa54bSIdo Schimmel
132e96fa54bSIdo Schimmel	vrf_prepare
133e96fa54bSIdo Schimmel
134e96fa54bSIdo Schimmel	h1_create
135e96fa54bSIdo Schimmel	h2_create
136e96fa54bSIdo Schimmel
137e96fa54bSIdo Schimmel	router_create
138e96fa54bSIdo Schimmel
139e96fa54bSIdo Schimmel	forwarding_enable
140e96fa54bSIdo Schimmel}
141e96fa54bSIdo Schimmel
142e96fa54bSIdo Schimmelcleanup()
143e96fa54bSIdo Schimmel{
144e96fa54bSIdo Schimmel	pre_cleanup
145e96fa54bSIdo Schimmel
146e96fa54bSIdo Schimmel	forwarding_restore
147e96fa54bSIdo Schimmel
148e96fa54bSIdo Schimmel	router_destroy
149e96fa54bSIdo Schimmel
150e96fa54bSIdo Schimmel	h2_destroy
151e96fa54bSIdo Schimmel	h1_destroy
152e96fa54bSIdo Schimmel
153e96fa54bSIdo Schimmel	vrf_cleanup
154e96fa54bSIdo Schimmel}
155e96fa54bSIdo Schimmel
156e96fa54bSIdo Schimmelping_ipv4()
157e96fa54bSIdo Schimmel{
158e96fa54bSIdo Schimmel	ping_test $h1 198.51.100.2
159e96fa54bSIdo Schimmel}
160e96fa54bSIdo Schimmel
161e96fa54bSIdo Schimmelping_ipv6()
162e96fa54bSIdo Schimmel{
163e96fa54bSIdo Schimmel	ping6_test $h1 2001:db8:2::2
164e96fa54bSIdo Schimmel}
165e96fa54bSIdo Schimmel
166e96fa54bSIdo Schimmeltrap cleanup EXIT
167e96fa54bSIdo Schimmel
168e96fa54bSIdo Schimmelsetup_prepare
169e96fa54bSIdo Schimmelsetup_wait
170e96fa54bSIdo Schimmelrouting_nh_obj
171e96fa54bSIdo Schimmel
172e96fa54bSIdo Schimmeltests_run
173e96fa54bSIdo Schimmel
174e96fa54bSIdo Schimmelexit $EXIT_STATUS
175