1*053f45beSAndroid Build Coastguard Worker#!/bin/sh 2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0 3*053f45beSAndroid Build Coastguard Worker 4*053f45beSAndroid Build Coastguard Worker# Author: Taehee Yoo <[email protected]> 5*053f45beSAndroid Build Coastguard Worker# 6*053f45beSAndroid Build Coastguard Worker# This script evaluates the AMT driver. 7*053f45beSAndroid Build Coastguard Worker# There are four network-namespaces, LISTENER, SOURCE, GATEWAY, RELAY. 8*053f45beSAndroid Build Coastguard Worker# The role of LISTENER is to listen multicast traffic. 9*053f45beSAndroid Build Coastguard Worker# In order to do that, it send IGMP group join message. 10*053f45beSAndroid Build Coastguard Worker# The role of SOURCE is to send multicast traffic to listener. 11*053f45beSAndroid Build Coastguard Worker# The role of GATEWAY is to work Gateway role of AMT interface. 12*053f45beSAndroid Build Coastguard Worker# The role of RELAY is to work Relay role of AMT interface. 13*053f45beSAndroid Build Coastguard Worker# 14*053f45beSAndroid Build Coastguard Worker# 15*053f45beSAndroid Build Coastguard Worker# +------------------------+ 16*053f45beSAndroid Build Coastguard Worker# | LISTENER netns | 17*053f45beSAndroid Build Coastguard Worker# | | 18*053f45beSAndroid Build Coastguard Worker# | +------------------+ | 19*053f45beSAndroid Build Coastguard Worker# | | l_gw | | 20*053f45beSAndroid Build Coastguard Worker# | | 192.168.0.2/24 | | 21*053f45beSAndroid Build Coastguard Worker# | | 2001:db8::2/64 | | 22*053f45beSAndroid Build Coastguard Worker# | +------------------+ | 23*053f45beSAndroid Build Coastguard Worker# | . | 24*053f45beSAndroid Build Coastguard Worker# +------------------------+ 25*053f45beSAndroid Build Coastguard Worker# . 26*053f45beSAndroid Build Coastguard Worker# . 27*053f45beSAndroid Build Coastguard Worker# +-----------------------------------------------------+ 28*053f45beSAndroid Build Coastguard Worker# | . GATEWAY netns | 29*053f45beSAndroid Build Coastguard Worker# | . | 30*053f45beSAndroid Build Coastguard Worker# |+---------------------------------------------------+| 31*053f45beSAndroid Build Coastguard Worker# || . br0 || 32*053f45beSAndroid Build Coastguard Worker# || +------------------+ +------------------+ || 33*053f45beSAndroid Build Coastguard Worker# || | gw_l | | amtg | || 34*053f45beSAndroid Build Coastguard Worker# || | 192.168.0.1/24 | +--------+---------+ || 35*053f45beSAndroid Build Coastguard Worker# || | 2001:db8::1/64 | | || 36*053f45beSAndroid Build Coastguard Worker# || +------------------+ | || 37*053f45beSAndroid Build Coastguard Worker# |+-------------------------------------|-------------+| 38*053f45beSAndroid Build Coastguard Worker# | | | 39*053f45beSAndroid Build Coastguard Worker# | +--------+---------+ | 40*053f45beSAndroid Build Coastguard Worker# | | gw_relay | | 41*053f45beSAndroid Build Coastguard Worker# | | 10.0.0.1/24 | | 42*053f45beSAndroid Build Coastguard Worker# | +------------------+ | 43*053f45beSAndroid Build Coastguard Worker# | . | 44*053f45beSAndroid Build Coastguard Worker# +-----------------------------------------------------+ 45*053f45beSAndroid Build Coastguard Worker# . 46*053f45beSAndroid Build Coastguard Worker# . 47*053f45beSAndroid Build Coastguard Worker# +-----------------------------------------------------+ 48*053f45beSAndroid Build Coastguard Worker# | RELAY netns . | 49*053f45beSAndroid Build Coastguard Worker# | +------------------+ | 50*053f45beSAndroid Build Coastguard Worker# | | relay_gw | | 51*053f45beSAndroid Build Coastguard Worker# | | 10.0.0.2/24 | | 52*053f45beSAndroid Build Coastguard Worker# | +--------+---------+ | 53*053f45beSAndroid Build Coastguard Worker# | | | 54*053f45beSAndroid Build Coastguard Worker# | | | 55*053f45beSAndroid Build Coastguard Worker# | +------------------+ +--------+---------+ | 56*053f45beSAndroid Build Coastguard Worker# | | relay_src | | amtr | | 57*053f45beSAndroid Build Coastguard Worker# | | 172.17.0.1/24 | +------------------+ | 58*053f45beSAndroid Build Coastguard Worker# | | 2001:db8:3::1/64 | | 59*053f45beSAndroid Build Coastguard Worker# | +------------------+ | 60*053f45beSAndroid Build Coastguard Worker# | . | 61*053f45beSAndroid Build Coastguard Worker# | . | 62*053f45beSAndroid Build Coastguard Worker# +-----------------------------------------------------+ 63*053f45beSAndroid Build Coastguard Worker# . 64*053f45beSAndroid Build Coastguard Worker# . 65*053f45beSAndroid Build Coastguard Worker# +------------------------+ 66*053f45beSAndroid Build Coastguard Worker# | . | 67*053f45beSAndroid Build Coastguard Worker# | +------------------+ | 68*053f45beSAndroid Build Coastguard Worker# | | src_relay | | 69*053f45beSAndroid Build Coastguard Worker# | | 172.17.0.2/24 | | 70*053f45beSAndroid Build Coastguard Worker# | | 2001:db8:3::2/64 | | 71*053f45beSAndroid Build Coastguard Worker# | +------------------+ | 72*053f45beSAndroid Build Coastguard Worker# | SOURCE netns | 73*053f45beSAndroid Build Coastguard Worker# +------------------------+ 74*053f45beSAndroid Build Coastguard Worker#============================================================================== 75*053f45beSAndroid Build Coastguard Worker 76*053f45beSAndroid Build Coastguard Workerreadonly LISTENER=$(mktemp -u listener-XXXXXXXX) 77*053f45beSAndroid Build Coastguard Workerreadonly GATEWAY=$(mktemp -u gateway-XXXXXXXX) 78*053f45beSAndroid Build Coastguard Workerreadonly RELAY=$(mktemp -u relay-XXXXXXXX) 79*053f45beSAndroid Build Coastguard Workerreadonly SOURCE=$(mktemp -u source-XXXXXXXX) 80*053f45beSAndroid Build Coastguard WorkerERR=4 81*053f45beSAndroid Build Coastguard Workererr=0 82*053f45beSAndroid Build Coastguard Worker 83*053f45beSAndroid Build Coastguard Workerexit_cleanup() 84*053f45beSAndroid Build Coastguard Worker{ 85*053f45beSAndroid Build Coastguard Worker for ns in "$@"; do 86*053f45beSAndroid Build Coastguard Worker ip netns delete "${ns}" 2>/dev/null || true 87*053f45beSAndroid Build Coastguard Worker done 88*053f45beSAndroid Build Coastguard Worker 89*053f45beSAndroid Build Coastguard Worker exit $ERR 90*053f45beSAndroid Build Coastguard Worker} 91*053f45beSAndroid Build Coastguard Worker 92*053f45beSAndroid Build Coastguard Workercreate_namespaces() 93*053f45beSAndroid Build Coastguard Worker{ 94*053f45beSAndroid Build Coastguard Worker ip netns add "${LISTENER}" || exit_cleanup 95*053f45beSAndroid Build Coastguard Worker ip netns add "${GATEWAY}" || exit_cleanup "${LISTENER}" 96*053f45beSAndroid Build Coastguard Worker ip netns add "${RELAY}" || exit_cleanup "${LISTENER}" "${GATEWAY}" 97*053f45beSAndroid Build Coastguard Worker ip netns add "${SOURCE}" || exit_cleanup "${LISTENER}" "${GATEWAY}" \ 98*053f45beSAndroid Build Coastguard Worker "${RELAY}" 99*053f45beSAndroid Build Coastguard Worker} 100*053f45beSAndroid Build Coastguard Worker 101*053f45beSAndroid Build Coastguard Worker# The trap function handler 102*053f45beSAndroid Build Coastguard Worker# 103*053f45beSAndroid Build Coastguard Workerexit_cleanup_all() 104*053f45beSAndroid Build Coastguard Worker{ 105*053f45beSAndroid Build Coastguard Worker exit_cleanup "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}" 106*053f45beSAndroid Build Coastguard Worker} 107*053f45beSAndroid Build Coastguard Worker 108*053f45beSAndroid Build Coastguard Workersetup_interface() 109*053f45beSAndroid Build Coastguard Worker{ 110*053f45beSAndroid Build Coastguard Worker for ns in "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}"; do 111*053f45beSAndroid Build Coastguard Worker ip -netns "${ns}" link set dev lo up 112*053f45beSAndroid Build Coastguard Worker done; 113*053f45beSAndroid Build Coastguard Worker 114*053f45beSAndroid Build Coastguard Worker ip link add l_gw type veth peer name gw_l 115*053f45beSAndroid Build Coastguard Worker ip link add gw_relay type veth peer name relay_gw 116*053f45beSAndroid Build Coastguard Worker ip link add relay_src type veth peer name src_relay 117*053f45beSAndroid Build Coastguard Worker 118*053f45beSAndroid Build Coastguard Worker ip link set l_gw netns "${LISTENER}" up 119*053f45beSAndroid Build Coastguard Worker ip link set gw_l netns "${GATEWAY}" up 120*053f45beSAndroid Build Coastguard Worker ip link set gw_relay netns "${GATEWAY}" up 121*053f45beSAndroid Build Coastguard Worker ip link set relay_gw netns "${RELAY}" up 122*053f45beSAndroid Build Coastguard Worker ip link set relay_src netns "${RELAY}" up 123*053f45beSAndroid Build Coastguard Worker ip link set src_relay netns "${SOURCE}" up mtu 1400 124*053f45beSAndroid Build Coastguard Worker 125*053f45beSAndroid Build Coastguard Worker ip netns exec "${LISTENER}" ip a a 192.168.0.2/24 dev l_gw 126*053f45beSAndroid Build Coastguard Worker ip netns exec "${LISTENER}" ip r a default via 192.168.0.1 dev l_gw 127*053f45beSAndroid Build Coastguard Worker ip netns exec "${LISTENER}" ip a a 2001:db8::2/64 dev l_gw 128*053f45beSAndroid Build Coastguard Worker ip netns exec "${LISTENER}" ip r a default via 2001:db8::1 dev l_gw 129*053f45beSAndroid Build Coastguard Worker ip netns exec "${LISTENER}" ip a a 239.0.0.1/32 dev l_gw autojoin 130*053f45beSAndroid Build Coastguard Worker ip netns exec "${LISTENER}" ip a a ff0e::5:6/128 dev l_gw autojoin 131*053f45beSAndroid Build Coastguard Worker 132*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip a a 192.168.0.1/24 dev gw_l 133*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip a a 2001:db8::1/64 dev gw_l 134*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip a a 10.0.0.1/24 dev gw_relay 135*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip link add br0 type bridge 136*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip link set br0 up 137*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip link set gw_l master br0 138*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip link set gw_l up 139*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip link add amtg master br0 type amt \ 140*053f45beSAndroid Build Coastguard Worker mode gateway local 10.0.0.1 discovery 10.0.0.2 dev gw_relay \ 141*053f45beSAndroid Build Coastguard Worker gateway_port 2268 relay_port 2268 142*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" ip a a 10.0.0.2/24 dev relay_gw 143*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" ip link add amtr type amt mode relay \ 144*053f45beSAndroid Build Coastguard Worker local 10.0.0.2 dev relay_gw relay_port 2268 max_tunnels 4 145*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" ip a a 172.17.0.1/24 dev relay_src 146*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" ip a a 2001:db8:3::1/64 dev relay_src 147*053f45beSAndroid Build Coastguard Worker ip netns exec "${SOURCE}" ip a a 172.17.0.2/24 dev src_relay 148*053f45beSAndroid Build Coastguard Worker ip netns exec "${SOURCE}" ip a a 2001:db8:3::2/64 dev src_relay 149*053f45beSAndroid Build Coastguard Worker ip netns exec "${SOURCE}" ip r a default via 172.17.0.1 dev src_relay 150*053f45beSAndroid Build Coastguard Worker ip netns exec "${SOURCE}" ip r a default via 2001:db8:3::1 dev src_relay 151*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" ip link set amtr up 152*053f45beSAndroid Build Coastguard Worker ip netns exec "${GATEWAY}" ip link set amtg up 153*053f45beSAndroid Build Coastguard Worker} 154*053f45beSAndroid Build Coastguard Worker 155*053f45beSAndroid Build Coastguard Workersetup_sysctl() 156*053f45beSAndroid Build Coastguard Worker{ 157*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" sysctl net.ipv4.ip_forward=1 -w -q 158*053f45beSAndroid Build Coastguard Worker} 159*053f45beSAndroid Build Coastguard Worker 160*053f45beSAndroid Build Coastguard Workersetup_iptables() 161*053f45beSAndroid Build Coastguard Worker{ 162*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" iptables -t mangle -I PREROUTING \ 163*053f45beSAndroid Build Coastguard Worker -d 239.0.0.1 -j TTL --ttl-set 2 164*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" ip6tables -t mangle -I PREROUTING \ 165*053f45beSAndroid Build Coastguard Worker -j HL --hl-set 2 166*053f45beSAndroid Build Coastguard Worker} 167*053f45beSAndroid Build Coastguard Worker 168*053f45beSAndroid Build Coastguard Workersetup_mcast_routing() 169*053f45beSAndroid Build Coastguard Worker{ 170*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" smcrouted 171*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" smcroutectl a relay_src \ 172*053f45beSAndroid Build Coastguard Worker 172.17.0.2 239.0.0.1 amtr 173*053f45beSAndroid Build Coastguard Worker ip netns exec "${RELAY}" smcroutectl a relay_src \ 174*053f45beSAndroid Build Coastguard Worker 2001:db8:3::2 ff0e::5:6 amtr 175*053f45beSAndroid Build Coastguard Worker} 176*053f45beSAndroid Build Coastguard Worker 177*053f45beSAndroid Build Coastguard Workertest_remote_ip() 178*053f45beSAndroid Build Coastguard Worker{ 179*053f45beSAndroid Build Coastguard Worker REMOTE=$(ip netns exec "${GATEWAY}" \ 180*053f45beSAndroid Build Coastguard Worker ip -d -j link show amtg | jq .[0].linkinfo.info_data.remote) 181*053f45beSAndroid Build Coastguard Worker if [ $REMOTE == "\"10.0.0.2\"" ]; then 182*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s [ OK ]\n" "amt discovery" 183*053f45beSAndroid Build Coastguard Worker else 184*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s [FAIL]\n" "amt discovery" 185*053f45beSAndroid Build Coastguard Worker ERR=1 186*053f45beSAndroid Build Coastguard Worker fi 187*053f45beSAndroid Build Coastguard Worker} 188*053f45beSAndroid Build Coastguard Worker 189*053f45beSAndroid Build Coastguard Workersend_mcast_torture4() 190*053f45beSAndroid Build Coastguard Worker{ 191*053f45beSAndroid Build Coastguard Worker ip netns exec "${SOURCE}" bash -c \ 192*053f45beSAndroid Build Coastguard Worker 'cat /dev/urandom | head -c 1G | nc -w 1 -u 239.0.0.1 4001' 193*053f45beSAndroid Build Coastguard Worker} 194*053f45beSAndroid Build Coastguard Worker 195*053f45beSAndroid Build Coastguard Worker 196*053f45beSAndroid Build Coastguard Workersend_mcast_torture6() 197*053f45beSAndroid Build Coastguard Worker{ 198*053f45beSAndroid Build Coastguard Worker ip netns exec "${SOURCE}" bash -c \ 199*053f45beSAndroid Build Coastguard Worker 'cat /dev/urandom | head -c 1G | nc -w 1 -u ff0e::5:6 6001' 200*053f45beSAndroid Build Coastguard Worker} 201*053f45beSAndroid Build Coastguard Worker 202*053f45beSAndroid Build Coastguard Workercheck_features() 203*053f45beSAndroid Build Coastguard Worker{ 204*053f45beSAndroid Build Coastguard Worker ip link help 2>&1 | grep -q amt 205*053f45beSAndroid Build Coastguard Worker if [ $? -ne 0 ]; then 206*053f45beSAndroid Build Coastguard Worker echo "Missing amt support in iproute2" >&2 207*053f45beSAndroid Build Coastguard Worker exit_cleanup 208*053f45beSAndroid Build Coastguard Worker fi 209*053f45beSAndroid Build Coastguard Worker} 210*053f45beSAndroid Build Coastguard Worker 211*053f45beSAndroid Build Coastguard Workertest_ipv4_forward() 212*053f45beSAndroid Build Coastguard Worker{ 213*053f45beSAndroid Build Coastguard Worker RESULT4=$(ip netns exec "${LISTENER}" nc -w 1 -l -u 239.0.0.1 4000) 214*053f45beSAndroid Build Coastguard Worker if [ "$RESULT4" == "172.17.0.2" ]; then 215*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s [ OK ]\n" "IPv4 amt multicast forwarding" 216*053f45beSAndroid Build Coastguard Worker exit 0 217*053f45beSAndroid Build Coastguard Worker else 218*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s [FAIL]\n" "IPv4 amt multicast forwarding" 219*053f45beSAndroid Build Coastguard Worker exit 1 220*053f45beSAndroid Build Coastguard Worker fi 221*053f45beSAndroid Build Coastguard Worker} 222*053f45beSAndroid Build Coastguard Worker 223*053f45beSAndroid Build Coastguard Workertest_ipv6_forward() 224*053f45beSAndroid Build Coastguard Worker{ 225*053f45beSAndroid Build Coastguard Worker RESULT6=$(ip netns exec "${LISTENER}" nc -w 1 -l -u ff0e::5:6 6000) 226*053f45beSAndroid Build Coastguard Worker if [ "$RESULT6" == "2001:db8:3::2" ]; then 227*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s [ OK ]\n" "IPv6 amt multicast forwarding" 228*053f45beSAndroid Build Coastguard Worker exit 0 229*053f45beSAndroid Build Coastguard Worker else 230*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s [FAIL]\n" "IPv6 amt multicast forwarding" 231*053f45beSAndroid Build Coastguard Worker exit 1 232*053f45beSAndroid Build Coastguard Worker fi 233*053f45beSAndroid Build Coastguard Worker} 234*053f45beSAndroid Build Coastguard Worker 235*053f45beSAndroid Build Coastguard Workersend_mcast4() 236*053f45beSAndroid Build Coastguard Worker{ 237*053f45beSAndroid Build Coastguard Worker sleep 2 238*053f45beSAndroid Build Coastguard Worker ip netns exec "${SOURCE}" bash -c \ 239*053f45beSAndroid Build Coastguard Worker 'echo 172.17.0.2 | nc -w 1 -u 239.0.0.1 4000' & 240*053f45beSAndroid Build Coastguard Worker} 241*053f45beSAndroid Build Coastguard Worker 242*053f45beSAndroid Build Coastguard Workersend_mcast6() 243*053f45beSAndroid Build Coastguard Worker{ 244*053f45beSAndroid Build Coastguard Worker sleep 2 245*053f45beSAndroid Build Coastguard Worker ip netns exec "${SOURCE}" bash -c \ 246*053f45beSAndroid Build Coastguard Worker 'echo 2001:db8:3::2 | nc -w 1 -u ff0e::5:6 6000' & 247*053f45beSAndroid Build Coastguard Worker} 248*053f45beSAndroid Build Coastguard Worker 249*053f45beSAndroid Build Coastguard Workercheck_features 250*053f45beSAndroid Build Coastguard Worker 251*053f45beSAndroid Build Coastguard Workercreate_namespaces 252*053f45beSAndroid Build Coastguard Worker 253*053f45beSAndroid Build Coastguard Workerset -e 254*053f45beSAndroid Build Coastguard Workertrap exit_cleanup_all EXIT 255*053f45beSAndroid Build Coastguard Worker 256*053f45beSAndroid Build Coastguard Workersetup_interface 257*053f45beSAndroid Build Coastguard Workersetup_sysctl 258*053f45beSAndroid Build Coastguard Workersetup_iptables 259*053f45beSAndroid Build Coastguard Workersetup_mcast_routing 260*053f45beSAndroid Build Coastguard Workertest_remote_ip 261*053f45beSAndroid Build Coastguard Workertest_ipv4_forward & 262*053f45beSAndroid Build Coastguard Workerpid=$! 263*053f45beSAndroid Build Coastguard Workersend_mcast4 264*053f45beSAndroid Build Coastguard Workerwait $pid || err=$? 265*053f45beSAndroid Build Coastguard Workerif [ $err -eq 1 ]; then 266*053f45beSAndroid Build Coastguard Worker ERR=1 267*053f45beSAndroid Build Coastguard Workerfi 268*053f45beSAndroid Build Coastguard Workertest_ipv6_forward & 269*053f45beSAndroid Build Coastguard Workerpid=$! 270*053f45beSAndroid Build Coastguard Workersend_mcast6 271*053f45beSAndroid Build Coastguard Workerwait $pid || err=$? 272*053f45beSAndroid Build Coastguard Workerif [ $err -eq 1 ]; then 273*053f45beSAndroid Build Coastguard Worker ERR=1 274*053f45beSAndroid Build Coastguard Workerfi 275*053f45beSAndroid Build Coastguard Workersend_mcast_torture4 276*053f45beSAndroid Build Coastguard Workerprintf "TEST: %-60s [ OK ]\n" "IPv4 amt traffic forwarding torture" 277*053f45beSAndroid Build Coastguard Workersend_mcast_torture6 278*053f45beSAndroid Build Coastguard Workerprintf "TEST: %-60s [ OK ]\n" "IPv6 amt traffic forwarding torture" 279*053f45beSAndroid Build Coastguard Workersleep 5 280*053f45beSAndroid Build Coastguard Workerif [ "${ERR}" -eq 1 ]; then 281*053f45beSAndroid Build Coastguard Worker echo "Some tests failed." >&2 282*053f45beSAndroid Build Coastguard Workerelse 283*053f45beSAndroid Build Coastguard Worker ERR=0 284*053f45beSAndroid Build Coastguard Workerfi 285