2 # SPDX-License-Identifier: GPL-2.0
4 # Author: Taehee Yoo <ap420073@gmail.com>
6 # This script evaluates the AMT driver.
7 # There are four network-namespaces, LISTENER, SOURCE, GATEWAY, RELAY.
8 # The role of LISTENER is to listen multicast traffic.
9 # In order to do that, it send IGMP group join message.
10 # The role of SOURCE is to send multicast traffic to listener.
11 # The role of GATEWAY is to work Gateway role of AMT interface.
12 # The role of RELAY is to work Relay role of AMT interface.
15 # +------------------------+
18 # | +------------------+ |
20 # | | 192.168.0.2/24 | |
21 # | | 2001:db8::2/64 | |
22 # | +------------------+ |
24 # +------------------------+
27 # +-----------------------------------------------------+
30 # |+---------------------------------------------------+|
32 # || +------------------+ +------------------+ ||
33 # || | gw_l | | amtg | ||
34 # || | 192.168.0.1/24 | +--------+---------+ ||
35 # || | 2001:db8::1/64 | | ||
36 # || +------------------+ | ||
37 # |+-------------------------------------|-------------+|
39 # | +--------+---------+ |
42 # | +------------------+ |
44 # +-----------------------------------------------------+
47 # +-----------------------------------------------------+
49 # | +------------------+ |
52 # | +--------+---------+ |
55 # | +------------------+ +--------+---------+ |
56 # | | relay_src | | amtr | |
57 # | | 172.17.0.1/24 | +------------------+ |
58 # | | 2001:db8:3::1/64 | |
59 # | +------------------+ |
62 # +-----------------------------------------------------+
65 # +------------------------+
67 # | +------------------+ |
69 # | | 172.17.0.2/24 | |
70 # | | 2001:db8:3::2/64 | |
71 # | +------------------+ |
73 # +------------------------+
74 #==============================================================================
76 readonly LISTENER=$(mktemp -u listener-XXXXXXXX)
77 readonly GATEWAY=$(mktemp -u gateway-XXXXXXXX)
78 readonly RELAY=$(mktemp -u relay-XXXXXXXX)
79 readonly SOURCE=$(mktemp -u source-XXXXXXXX)
86 ip netns delete "${ns}" 2>/dev/null || true
94 ip netns add "${LISTENER}" || exit_cleanup
95 ip netns add "${GATEWAY}" || exit_cleanup "${LISTENER}"
96 ip netns add "${RELAY}" || exit_cleanup "${LISTENER}" "${GATEWAY}"
97 ip netns add "${SOURCE}" || exit_cleanup "${LISTENER}" "${GATEWAY}" \
101 # The trap function handler
105 exit_cleanup "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}"
110 for ns in "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}"; do
111 ip -netns "${ns}" link set dev lo up
114 ip link add l_gw type veth peer name gw_l
115 ip link add gw_relay type veth peer name relay_gw
116 ip link add relay_src type veth peer name src_relay
118 ip link set l_gw netns "${LISTENER}" up
119 ip link set gw_l netns "${GATEWAY}" up
120 ip link set gw_relay netns "${GATEWAY}" up
121 ip link set relay_gw netns "${RELAY}" up
122 ip link set relay_src netns "${RELAY}" up
123 ip link set src_relay netns "${SOURCE}" up mtu 1400
125 ip netns exec "${LISTENER}" ip a a 192.168.0.2/24 dev l_gw
126 ip netns exec "${LISTENER}" ip r a default via 192.168.0.1 dev l_gw
127 ip netns exec "${LISTENER}" ip a a 2001:db8::2/64 dev l_gw
128 ip netns exec "${LISTENER}" ip r a default via 2001:db8::1 dev l_gw
129 ip netns exec "${LISTENER}" ip a a 239.0.0.1/32 dev l_gw autojoin
130 ip netns exec "${LISTENER}" ip a a ff0e::5:6/128 dev l_gw autojoin
132 ip netns exec "${GATEWAY}" ip a a 192.168.0.1/24 dev gw_l
133 ip netns exec "${GATEWAY}" ip a a 2001:db8::1/64 dev gw_l
134 ip netns exec "${GATEWAY}" ip a a 10.0.0.1/24 dev gw_relay
135 ip netns exec "${GATEWAY}" ip link add br0 type bridge
136 ip netns exec "${GATEWAY}" ip link set br0 up
137 ip netns exec "${GATEWAY}" ip link set gw_l master br0
138 ip netns exec "${GATEWAY}" ip link set gw_l up
139 ip netns exec "${GATEWAY}" ip link add amtg master br0 type amt \
140 mode gateway local 10.0.0.1 discovery 10.0.0.2 dev gw_relay \
141 gateway_port 2268 relay_port 2268
142 ip netns exec "${RELAY}" ip a a 10.0.0.2/24 dev relay_gw
143 ip netns exec "${RELAY}" ip link add amtr type amt mode relay \
144 local 10.0.0.2 dev relay_gw relay_port 2268 max_tunnels 4
145 ip netns exec "${RELAY}" ip a a 172.17.0.1/24 dev relay_src
146 ip netns exec "${RELAY}" ip a a 2001:db8:3::1/64 dev relay_src
147 ip netns exec "${SOURCE}" ip a a 172.17.0.2/24 dev src_relay
148 ip netns exec "${SOURCE}" ip a a 2001:db8:3::2/64 dev src_relay
149 ip netns exec "${SOURCE}" ip r a default via 172.17.0.1 dev src_relay
150 ip netns exec "${SOURCE}" ip r a default via 2001:db8:3::1 dev src_relay
151 ip netns exec "${RELAY}" ip link set amtr up
152 ip netns exec "${GATEWAY}" ip link set amtg up
157 ip netns exec "${RELAY}" sysctl net.ipv4.ip_forward=1 -w -q
162 ip netns exec "${RELAY}" iptables -t mangle -I PREROUTING \
163 -d 239.0.0.1 -j TTL --ttl-set 2
164 ip netns exec "${RELAY}" ip6tables -t mangle -I PREROUTING \
168 setup_mcast_routing()
170 ip netns exec "${RELAY}" smcrouted
171 ip netns exec "${RELAY}" smcroutectl a relay_src \
172 172.17.0.2 239.0.0.1 amtr
173 ip netns exec "${RELAY}" smcroutectl a relay_src \
174 2001:db8:3::2 ff0e::5:6 amtr
179 REMOTE=$(ip netns exec "${GATEWAY}" \
180 ip -d -j link show amtg | jq .[0].linkinfo.info_data.remote)
181 if [ $REMOTE == "\"10.0.0.2\"" ]; then
182 printf "TEST: %-60s [ OK ]\n" "amt discovery"
184 printf "TEST: %-60s [FAIL]\n" "amt discovery"
189 send_mcast_torture4()
191 ip netns exec "${SOURCE}" bash -c \
192 'cat /dev/urandom | head -c 1G | nc -w 1 -u 239.0.0.1 4001'
196 send_mcast_torture6()
198 ip netns exec "${SOURCE}" bash -c \
199 'cat /dev/urandom | head -c 1G | nc -w 1 -u ff0e::5:6 6001'
204 ip link help 2>&1 | grep -q amt
205 if [ $? -ne 0 ]; then
206 echo "Missing amt support in iproute2" >&2
213 RESULT4=$(ip netns exec "${LISTENER}" nc -w 1 -l -u 239.0.0.1 4000)
214 if [ "$RESULT4" == "172.17.0.2" ]; then
215 printf "TEST: %-60s [ OK ]\n" "IPv4 amt multicast forwarding"
218 printf "TEST: %-60s [FAIL]\n" "IPv4 amt multicast forwarding"
225 RESULT6=$(ip netns exec "${LISTENER}" nc -w 1 -l -u ff0e::5:6 6000)
226 if [ "$RESULT6" == "2001:db8:3::2" ]; then
227 printf "TEST: %-60s [ OK ]\n" "IPv6 amt multicast forwarding"
230 printf "TEST: %-60s [FAIL]\n" "IPv6 amt multicast forwarding"
238 ip netns exec "${SOURCE}" bash -c \
239 'echo 172.17.0.2 | nc -w 1 -u 239.0.0.1 4000' &
245 ip netns exec "${SOURCE}" bash -c \
246 'echo 2001:db8:3::2 | nc -w 1 -u ff0e::5:6 6000' &
254 trap exit_cleanup_all EXIT
265 if [ $err -eq 1 ]; then
272 if [ $err -eq 1 ]; then
276 printf "TEST: %-60s [ OK ]\n" "IPv4 amt traffic forwarding torture"
278 printf "TEST: %-60s [ OK ]\n" "IPv6 amt traffic forwarding torture"
280 if [ "${ERR}" -eq 1 ]; then
281 echo "Some tests failed." >&2