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
)
80 readonly SMCROUTEDIR
="$(mktemp -d)"
87 ip netns delete
"${ns}" 2>/dev
/null || true
89 if [ -f "$SMCROUTEDIR/amt.pid" ]; then
90 smcpid
=$
(< $SMCROUTEDIR/amt.pid
)
100 ip netns add
"${LISTENER}" || exit_cleanup
101 ip netns add
"${GATEWAY}" || exit_cleanup
"${LISTENER}"
102 ip netns add
"${RELAY}" || exit_cleanup "${LISTENER}" "${GATEWAY}"
103 ip netns add
"${SOURCE}" || exit_cleanup "${LISTENER}" "${GATEWAY}" \
107 # The trap function handler
111 exit_cleanup
"${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}"
116 for ns
in "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}"; do
117 ip
-netns "${ns}" link
set dev lo up
120 ip link add l_gw
type veth peer name gw_l
121 ip link add gw_relay
type veth peer name relay_gw
122 ip link add relay_src
type veth peer name src_relay
124 ip link
set l_gw netns
"${LISTENER}" up
125 ip link
set gw_l netns
"${GATEWAY}" up
126 ip link
set gw_relay netns
"${GATEWAY}" up
127 ip link
set relay_gw netns
"${RELAY}" up
128 ip link
set relay_src netns
"${RELAY}" up
129 ip link
set src_relay netns
"${SOURCE}" up mtu
1400
131 ip netns
exec "${LISTENER}" ip a a
192.168.0.2/24 dev l_gw
132 ip netns
exec "${LISTENER}" ip r a default via
192.168.0.1 dev l_gw
133 ip netns
exec "${LISTENER}" ip a a
2001:db8
::2/64 dev l_gw
134 ip netns
exec "${LISTENER}" ip r a default via
2001:db8
::1 dev l_gw
135 ip netns
exec "${LISTENER}" ip a a
239.0.0.1/32 dev l_gw autojoin
136 ip netns
exec "${LISTENER}" ip a a ff0e
::5:6/128 dev l_gw autojoin
138 ip netns
exec "${GATEWAY}" ip a a
192.168.0.1/24 dev gw_l
139 ip netns
exec "${GATEWAY}" ip a a
2001:db8
::1/64 dev gw_l
140 ip netns
exec "${GATEWAY}" ip a a
10.0.0.1/24 dev gw_relay
141 ip netns
exec "${GATEWAY}" ip link add br0
type bridge
142 ip netns
exec "${GATEWAY}" ip link
set br0 up
143 ip netns
exec "${GATEWAY}" ip link
set gw_l master br0
144 ip netns
exec "${GATEWAY}" ip link
set gw_l up
145 ip netns
exec "${GATEWAY}" ip link add amtg master br0
type amt \
146 mode gateway
local 10.0.0.1 discovery
10.0.0.2 dev gw_relay \
147 gateway_port
2268 relay_port
2268
148 ip netns
exec "${RELAY}" ip a a
10.0.0.2/24 dev relay_gw
149 ip netns
exec "${RELAY}" ip link add amtr
type amt mode relay \
150 local 10.0.0.2 dev relay_gw relay_port
2268 max_tunnels
4
151 ip netns
exec "${RELAY}" ip a a
172.17.0.1/24 dev relay_src
152 ip netns
exec "${RELAY}" ip a a
2001:db8
:3::1/64 dev relay_src
153 ip netns
exec "${SOURCE}" ip a a
172.17.0.2/24 dev src_relay
154 ip netns
exec "${SOURCE}" ip a a
2001:db8
:3::2/64 dev src_relay
155 ip netns
exec "${SOURCE}" ip r a default via
172.17.0.1 dev src_relay
156 ip netns
exec "${SOURCE}" ip r a default via
2001:db8
:3::1 dev src_relay
157 ip netns
exec "${RELAY}" ip link
set amtr up
158 ip netns
exec "${GATEWAY}" ip link
set amtg up
163 ip netns
exec "${RELAY}" sysctl net.ipv4.ip_forward
=1 -w -q
168 ip netns
exec "${RELAY}" iptables
-t mangle
-I PREROUTING \
169 -d 239.0.0.1 -j TTL
--ttl-set 2
170 ip netns
exec "${RELAY}" ip6tables
-t mangle
-I PREROUTING \
174 setup_mcast_routing
()
176 ip netns
exec "${RELAY}" smcrouted
-P $SMCROUTEDIR/amt.pid
177 ip netns
exec "${RELAY}" smcroutectl a relay_src \
178 172.17.0.2 239.0.0.1 amtr
179 ip netns
exec "${RELAY}" smcroutectl a relay_src \
180 2001:db8
:3::2 ff0e
::5:6 amtr
185 REMOTE
=$
(ip netns
exec "${GATEWAY}" \
186 ip
-d -j link show amtg | jq .
[0].linkinfo.info_data.remote
)
187 if [ $REMOTE == "\"10.0.0.2\"" ]; then
188 printf "TEST: %-60s [ OK ]\n" "amt discovery"
190 printf "TEST: %-60s [FAIL]\n" "amt discovery"
195 send_mcast_torture4
()
197 ip netns
exec "${SOURCE}" bash
-c \
198 'cat /dev/urandom | head -c 1G | nc -w 1 -u 239.0.0.1 4001'
202 send_mcast_torture6
()
204 ip netns
exec "${SOURCE}" bash
-c \
205 'cat /dev/urandom | head -c 1G | nc -w 1 -u ff0e::5:6 6001'
210 ip link
help 2>&1 |
grep -q amt
211 if [ $?
-ne 0 ]; then
212 echo "Missing amt support in iproute2" >&2
219 RESULT4
=$
(ip netns
exec "${LISTENER}" timeout
15 socat
- UDP4-LISTEN
:4000,readbytes
=128 || true
)
220 if echo "$RESULT4" |
grep -q "172.17.0.2"; then
221 printf "TEST: %-60s [ OK ]\n" "IPv4 amt multicast forwarding"
224 printf "TEST: %-60s [FAIL]\n" "IPv4 amt multicast forwarding"
231 RESULT6
=$
(ip netns
exec "${LISTENER}" timeout
15 socat
- UDP6-LISTEN
:6000,readbytes
=128 || true
)
232 if echo "$RESULT6" |
grep -q "2001:db8:3::2"; then
233 printf "TEST: %-60s [ OK ]\n" "IPv6 amt multicast forwarding"
236 printf "TEST: %-60s [FAIL]\n" "IPv6 amt multicast forwarding"
244 ip netns
exec "${SOURCE}" bash
-c \
245 'printf "%s %128s" 172.17.0.2 | nc -w 1 -u 239.0.0.1 4000' &
251 ip netns
exec "${SOURCE}" bash
-c \
252 'printf "%s %128s" 2001:db8:3::2 | nc -w 1 -u ff0e::5:6 6000' &
260 trap exit_cleanup_all EXIT
271 if [ $err -eq 1 ]; then
278 if [ $err -eq 1 ]; then
282 printf "TEST: %-60s [ OK ]\n" "IPv4 amt traffic forwarding torture"
284 printf "TEST: %-60s [ OK ]\n" "IPv6 amt traffic forwarding torture"
286 if [ "${ERR}" -eq 1 ]; then
287 echo "Some tests failed." >&2