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# Test various bareudp tunnel configurations. 5*053f45beSAndroid Build Coastguard Worker# 6*053f45beSAndroid Build Coastguard Worker# The bareudp module allows to tunnel network protocols like IP or MPLS over 7*053f45beSAndroid Build Coastguard Worker# UDP, without adding any intermediate header. This scripts tests several 8*053f45beSAndroid Build Coastguard Worker# configurations of bareudp (using IPv4 or IPv6 as underlay and transporting 9*053f45beSAndroid Build Coastguard Worker# IPv4, IPv6 or MPLS packets on the overlay). 10*053f45beSAndroid Build Coastguard Worker# 11*053f45beSAndroid Build Coastguard Worker# Network topology: 12*053f45beSAndroid Build Coastguard Worker# 13*053f45beSAndroid Build Coastguard Worker# * A chain of 4 network namespaces, connected with veth pairs. Each veth 14*053f45beSAndroid Build Coastguard Worker# is assigned an IPv4 and an IPv6 address. A host-route allows a veth to 15*053f45beSAndroid Build Coastguard Worker# join its peer. 16*053f45beSAndroid Build Coastguard Worker# 17*053f45beSAndroid Build Coastguard Worker# * NS0 and NS3 are at the extremities of the chain. They have additional 18*053f45beSAndroid Build Coastguard Worker# IPv4 and IPv6 addresses on their loopback device. Routes are added in NS0 19*053f45beSAndroid Build Coastguard Worker# and NS3, so that they can communicate using these overlay IP addresses. 20*053f45beSAndroid Build Coastguard Worker# For IPv4 and IPv6 reachability tests, the route simply sets the peer's 21*053f45beSAndroid Build Coastguard Worker# veth address as gateway. For MPLS reachability tests, an MPLS header is 22*053f45beSAndroid Build Coastguard Worker# also pushed before the IP header. 23*053f45beSAndroid Build Coastguard Worker# 24*053f45beSAndroid Build Coastguard Worker# * NS1 and NS2 are the intermediate namespaces. They use a bareudp device to 25*053f45beSAndroid Build Coastguard Worker# encapsulate the traffic into UDP. 26*053f45beSAndroid Build Coastguard Worker# 27*053f45beSAndroid Build Coastguard Worker# +-----------------------------------------------------------------------+ 28*053f45beSAndroid Build Coastguard Worker# | NS0 | 29*053f45beSAndroid Build Coastguard Worker# | | 30*053f45beSAndroid Build Coastguard Worker# | lo: | 31*053f45beSAndroid Build Coastguard Worker# | * IPv4 address: 192.0.2.100/32 | 32*053f45beSAndroid Build Coastguard Worker# | * IPv6 address: 2001:db8::100/128 | 33*053f45beSAndroid Build Coastguard Worker# | * IPv6 address: 2001:db8::200/128 | 34*053f45beSAndroid Build Coastguard Worker# | * IPv4 route: 192.0.2.103/32 reachable via 192.0.2.11 | 35*053f45beSAndroid Build Coastguard Worker# | * IPv6 route: 2001:db8::103/128 reachable via 2001:db8::11 | 36*053f45beSAndroid Build Coastguard Worker# | * IPv6 route: 2001:db8::203/128 reachable via 2001:db8::11 | 37*053f45beSAndroid Build Coastguard Worker# | (encapsulated with MPLS label 203) | 38*053f45beSAndroid Build Coastguard Worker# | | 39*053f45beSAndroid Build Coastguard Worker# | veth01: | 40*053f45beSAndroid Build Coastguard Worker# | ^ * IPv4 address: 192.0.2.10, peer 192.0.2.11/32 | 41*053f45beSAndroid Build Coastguard Worker# | | * IPv6 address: 2001:db8::10, peer 2001:db8::11/128 | 42*053f45beSAndroid Build Coastguard Worker# | | | 43*053f45beSAndroid Build Coastguard Worker# +---+-------------------------------------------------------------------+ 44*053f45beSAndroid Build Coastguard Worker# | 45*053f45beSAndroid Build Coastguard Worker# | Traffic type: IP or MPLS (depending on test) 46*053f45beSAndroid Build Coastguard Worker# | 47*053f45beSAndroid Build Coastguard Worker# +---+-------------------------------------------------------------------+ 48*053f45beSAndroid Build Coastguard Worker# | | NS1 | 49*053f45beSAndroid Build Coastguard Worker# | | | 50*053f45beSAndroid Build Coastguard Worker# | v | 51*053f45beSAndroid Build Coastguard Worker# | veth10: | 52*053f45beSAndroid Build Coastguard Worker# | * IPv4 address: 192.0.2.11, peer 192.0.2.10/32 | 53*053f45beSAndroid Build Coastguard Worker# | * IPv6 address: 2001:db8::11, peer 2001:db8::10/128 | 54*053f45beSAndroid Build Coastguard Worker# | | 55*053f45beSAndroid Build Coastguard Worker# | bareudp_ns1: | 56*053f45beSAndroid Build Coastguard Worker# | * Encapsulate IP or MPLS packets received on veth10 into UDP | 57*053f45beSAndroid Build Coastguard Worker# | and send the resulting packets through veth12. | 58*053f45beSAndroid Build Coastguard Worker# | * Decapsulate bareudp packets (either IP or MPLS, over UDP) | 59*053f45beSAndroid Build Coastguard Worker# | received on veth12 and send the inner packets through veth10. | 60*053f45beSAndroid Build Coastguard Worker# | | 61*053f45beSAndroid Build Coastguard Worker# | veth12: | 62*053f45beSAndroid Build Coastguard Worker# | ^ * IPv4 address: 192.0.2.21, peer 192.0.2.22/32 | 63*053f45beSAndroid Build Coastguard Worker# | | * IPv6 address: 2001:db8::21, peer 2001:db8::22/128 | 64*053f45beSAndroid Build Coastguard Worker# | | | 65*053f45beSAndroid Build Coastguard Worker# +---+-------------------------------------------------------------------+ 66*053f45beSAndroid Build Coastguard Worker# | 67*053f45beSAndroid Build Coastguard Worker# | Traffic type: IP or MPLS (depending on test), over UDP 68*053f45beSAndroid Build Coastguard Worker# | 69*053f45beSAndroid Build Coastguard Worker# +---+-------------------------------------------------------------------+ 70*053f45beSAndroid Build Coastguard Worker# | | NS2 | 71*053f45beSAndroid Build Coastguard Worker# | | | 72*053f45beSAndroid Build Coastguard Worker# | v | 73*053f45beSAndroid Build Coastguard Worker# | veth21: | 74*053f45beSAndroid Build Coastguard Worker# | * IPv4 address: 192.0.2.22, peer 192.0.2.21/32 | 75*053f45beSAndroid Build Coastguard Worker# | * IPv6 address: 2001:db8::22, peer 2001:db8::21/128 | 76*053f45beSAndroid Build Coastguard Worker# | | 77*053f45beSAndroid Build Coastguard Worker# | bareudp_ns2: | 78*053f45beSAndroid Build Coastguard Worker# | * Decapsulate bareudp packets (either IP or MPLS, over UDP) | 79*053f45beSAndroid Build Coastguard Worker# | received on veth21 and send the inner packets through veth23. | 80*053f45beSAndroid Build Coastguard Worker# | * Encapsulate IP or MPLS packets received on veth23 into UDP | 81*053f45beSAndroid Build Coastguard Worker# | and send the resulting packets through veth21. | 82*053f45beSAndroid Build Coastguard Worker# | | 83*053f45beSAndroid Build Coastguard Worker# | veth23: | 84*053f45beSAndroid Build Coastguard Worker# | ^ * IPv4 address: 192.0.2.32, peer 192.0.2.33/32 | 85*053f45beSAndroid Build Coastguard Worker# | | * IPv6 address: 2001:db8::32, peer 2001:db8::33/128 | 86*053f45beSAndroid Build Coastguard Worker# | | | 87*053f45beSAndroid Build Coastguard Worker# +---+-------------------------------------------------------------------+ 88*053f45beSAndroid Build Coastguard Worker# | 89*053f45beSAndroid Build Coastguard Worker# | Traffic type: IP or MPLS (depending on test) 90*053f45beSAndroid Build Coastguard Worker# | 91*053f45beSAndroid Build Coastguard Worker# +---+-------------------------------------------------------------------+ 92*053f45beSAndroid Build Coastguard Worker# | | NS3 | 93*053f45beSAndroid Build Coastguard Worker# | v | 94*053f45beSAndroid Build Coastguard Worker# | veth32: | 95*053f45beSAndroid Build Coastguard Worker# | * IPv4 address: 192.0.2.33, peer 192.0.2.32/32 | 96*053f45beSAndroid Build Coastguard Worker# | * IPv6 address: 2001:db8::33, peer 2001:db8::32/128 | 97*053f45beSAndroid Build Coastguard Worker# | | 98*053f45beSAndroid Build Coastguard Worker# | lo: | 99*053f45beSAndroid Build Coastguard Worker# | * IPv4 address: 192.0.2.103/32 | 100*053f45beSAndroid Build Coastguard Worker# | * IPv6 address: 2001:db8::103/128 | 101*053f45beSAndroid Build Coastguard Worker# | * IPv6 address: 2001:db8::203/128 | 102*053f45beSAndroid Build Coastguard Worker# | * IPv4 route: 192.0.2.100/32 reachable via 192.0.2.32 | 103*053f45beSAndroid Build Coastguard Worker# | * IPv6 route: 2001:db8::100/128 reachable via 2001:db8::32 | 104*053f45beSAndroid Build Coastguard Worker# | * IPv6 route: 2001:db8::200/128 reachable via 2001:db8::32 | 105*053f45beSAndroid Build Coastguard Worker# | (encapsulated with MPLS label 200) | 106*053f45beSAndroid Build Coastguard Worker# | | 107*053f45beSAndroid Build Coastguard Worker# +-----------------------------------------------------------------------+ 108*053f45beSAndroid Build Coastguard Worker 109*053f45beSAndroid Build Coastguard WorkerERR=4 # Return 4 by default, which is the SKIP code for kselftest 110*053f45beSAndroid Build Coastguard WorkerPING6="ping" 111*053f45beSAndroid Build Coastguard WorkerPAUSE_ON_FAIL="no" 112*053f45beSAndroid Build Coastguard Worker 113*053f45beSAndroid Build Coastguard Workerreadonly NS0=$(mktemp -u ns0-XXXXXXXX) 114*053f45beSAndroid Build Coastguard Workerreadonly NS1=$(mktemp -u ns1-XXXXXXXX) 115*053f45beSAndroid Build Coastguard Workerreadonly NS2=$(mktemp -u ns2-XXXXXXXX) 116*053f45beSAndroid Build Coastguard Workerreadonly NS3=$(mktemp -u ns3-XXXXXXXX) 117*053f45beSAndroid Build Coastguard Worker 118*053f45beSAndroid Build Coastguard Worker# Exit the script after having removed the network namespaces it created 119*053f45beSAndroid Build Coastguard Worker# 120*053f45beSAndroid Build Coastguard Worker# Parameters: 121*053f45beSAndroid Build Coastguard Worker# 122*053f45beSAndroid Build Coastguard Worker# * The list of network namespaces to delete before exiting. 123*053f45beSAndroid Build Coastguard Worker# 124*053f45beSAndroid Build Coastguard Workerexit_cleanup() 125*053f45beSAndroid Build Coastguard Worker{ 126*053f45beSAndroid Build Coastguard Worker for ns in "$@"; do 127*053f45beSAndroid Build Coastguard Worker ip netns delete "${ns}" 2>/dev/null || true 128*053f45beSAndroid Build Coastguard Worker done 129*053f45beSAndroid Build Coastguard Worker 130*053f45beSAndroid Build Coastguard Worker if [ "${ERR}" -eq 4 ]; then 131*053f45beSAndroid Build Coastguard Worker echo "Error: Setting up the testing environment failed." >&2 132*053f45beSAndroid Build Coastguard Worker fi 133*053f45beSAndroid Build Coastguard Worker 134*053f45beSAndroid Build Coastguard Worker exit "${ERR}" 135*053f45beSAndroid Build Coastguard Worker} 136*053f45beSAndroid Build Coastguard Worker 137*053f45beSAndroid Build Coastguard Worker# Create the four network namespaces used by the script (NS0, NS1, NS2 and NS3) 138*053f45beSAndroid Build Coastguard Worker# 139*053f45beSAndroid Build Coastguard Worker# New namespaces are cleaned up manually in case of error, to ensure that only 140*053f45beSAndroid Build Coastguard Worker# namespaces created by this script are deleted. 141*053f45beSAndroid Build Coastguard Workercreate_namespaces() 142*053f45beSAndroid Build Coastguard Worker{ 143*053f45beSAndroid Build Coastguard Worker ip netns add "${NS0}" || exit_cleanup 144*053f45beSAndroid Build Coastguard Worker ip netns add "${NS1}" || exit_cleanup "${NS0}" 145*053f45beSAndroid Build Coastguard Worker ip netns add "${NS2}" || exit_cleanup "${NS0}" "${NS1}" 146*053f45beSAndroid Build Coastguard Worker ip netns add "${NS3}" || exit_cleanup "${NS0}" "${NS1}" "${NS2}" 147*053f45beSAndroid Build Coastguard Worker} 148*053f45beSAndroid Build Coastguard Worker 149*053f45beSAndroid Build Coastguard Worker# The trap function handler 150*053f45beSAndroid Build Coastguard Worker# 151*053f45beSAndroid Build Coastguard Workerexit_cleanup_all() 152*053f45beSAndroid Build Coastguard Worker{ 153*053f45beSAndroid Build Coastguard Worker exit_cleanup "${NS0}" "${NS1}" "${NS2}" "${NS3}" 154*053f45beSAndroid Build Coastguard Worker} 155*053f45beSAndroid Build Coastguard Worker 156*053f45beSAndroid Build Coastguard Worker# Configure a network interface using a host route 157*053f45beSAndroid Build Coastguard Worker# 158*053f45beSAndroid Build Coastguard Worker# Parameters 159*053f45beSAndroid Build Coastguard Worker# 160*053f45beSAndroid Build Coastguard Worker# * $1: the netns the network interface resides in, 161*053f45beSAndroid Build Coastguard Worker# * $2: the network interface name, 162*053f45beSAndroid Build Coastguard Worker# * $3: the local IPv4 address to assign to this interface, 163*053f45beSAndroid Build Coastguard Worker# * $4: the IPv4 address of the remote network interface, 164*053f45beSAndroid Build Coastguard Worker# * $5: the local IPv6 address to assign to this interface, 165*053f45beSAndroid Build Coastguard Worker# * $6: the IPv6 address of the remote network interface. 166*053f45beSAndroid Build Coastguard Worker# 167*053f45beSAndroid Build Coastguard Workeriface_config() 168*053f45beSAndroid Build Coastguard Worker{ 169*053f45beSAndroid Build Coastguard Worker local NS="${1}"; readonly NS 170*053f45beSAndroid Build Coastguard Worker local DEV="${2}"; readonly DEV 171*053f45beSAndroid Build Coastguard Worker local LOCAL_IP4="${3}"; readonly LOCAL_IP4 172*053f45beSAndroid Build Coastguard Worker local PEER_IP4="${4}"; readonly PEER_IP4 173*053f45beSAndroid Build Coastguard Worker local LOCAL_IP6="${5}"; readonly LOCAL_IP6 174*053f45beSAndroid Build Coastguard Worker local PEER_IP6="${6}"; readonly PEER_IP6 175*053f45beSAndroid Build Coastguard Worker 176*053f45beSAndroid Build Coastguard Worker ip -netns "${NS}" link set dev "${DEV}" up 177*053f45beSAndroid Build Coastguard Worker ip -netns "${NS}" address add dev "${DEV}" "${LOCAL_IP4}" peer "${PEER_IP4}" 178*053f45beSAndroid Build Coastguard Worker ip -netns "${NS}" address add dev "${DEV}" "${LOCAL_IP6}" peer "${PEER_IP6}" nodad 179*053f45beSAndroid Build Coastguard Worker} 180*053f45beSAndroid Build Coastguard Worker 181*053f45beSAndroid Build Coastguard Worker# Create base networking topology: 182*053f45beSAndroid Build Coastguard Worker# 183*053f45beSAndroid Build Coastguard Worker# * set up the loopback device in all network namespaces (NS0..NS3), 184*053f45beSAndroid Build Coastguard Worker# * set up a veth pair to connect each netns in sequence (NS0 with NS1, 185*053f45beSAndroid Build Coastguard Worker# NS1 with NS2, etc.), 186*053f45beSAndroid Build Coastguard Worker# * add and IPv4 and an IPv6 address on each veth interface, 187*053f45beSAndroid Build Coastguard Worker# * prepare the ingress qdiscs in the intermediate namespaces. 188*053f45beSAndroid Build Coastguard Worker# 189*053f45beSAndroid Build Coastguard Workersetup_underlay() 190*053f45beSAndroid Build Coastguard Worker{ 191*053f45beSAndroid Build Coastguard Worker for ns in "${NS0}" "${NS1}" "${NS2}" "${NS3}"; do 192*053f45beSAndroid Build Coastguard Worker ip -netns "${ns}" link set dev lo up 193*053f45beSAndroid Build Coastguard Worker done; 194*053f45beSAndroid Build Coastguard Worker 195*053f45beSAndroid Build Coastguard Worker ip link add name veth01 netns "${NS0}" type veth peer name veth10 netns "${NS1}" 196*053f45beSAndroid Build Coastguard Worker ip link add name veth12 netns "${NS1}" type veth peer name veth21 netns "${NS2}" 197*053f45beSAndroid Build Coastguard Worker ip link add name veth23 netns "${NS2}" type veth peer name veth32 netns "${NS3}" 198*053f45beSAndroid Build Coastguard Worker iface_config "${NS0}" veth01 192.0.2.10 192.0.2.11/32 2001:db8::10 2001:db8::11/128 199*053f45beSAndroid Build Coastguard Worker iface_config "${NS1}" veth10 192.0.2.11 192.0.2.10/32 2001:db8::11 2001:db8::10/128 200*053f45beSAndroid Build Coastguard Worker iface_config "${NS1}" veth12 192.0.2.21 192.0.2.22/32 2001:db8::21 2001:db8::22/128 201*053f45beSAndroid Build Coastguard Worker iface_config "${NS2}" veth21 192.0.2.22 192.0.2.21/32 2001:db8::22 2001:db8::21/128 202*053f45beSAndroid Build Coastguard Worker iface_config "${NS2}" veth23 192.0.2.32 192.0.2.33/32 2001:db8::32 2001:db8::33/128 203*053f45beSAndroid Build Coastguard Worker iface_config "${NS3}" veth32 192.0.2.33 192.0.2.32/32 2001:db8::33 2001:db8::32/128 204*053f45beSAndroid Build Coastguard Worker 205*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" qdisc add dev veth10 ingress 206*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" qdisc add dev veth23 ingress 207*053f45beSAndroid Build Coastguard Worker} 208*053f45beSAndroid Build Coastguard Worker 209*053f45beSAndroid Build Coastguard Worker# Set up the IPv4, IPv6 and MPLS overlays. 210*053f45beSAndroid Build Coastguard Worker# 211*053f45beSAndroid Build Coastguard Worker# Configuration is similar for all protocols: 212*053f45beSAndroid Build Coastguard Worker# 213*053f45beSAndroid Build Coastguard Worker# * add an overlay IP address on the loopback interface of each edge 214*053f45beSAndroid Build Coastguard Worker# namespace, 215*053f45beSAndroid Build Coastguard Worker# * route these IP addresses via the intermediate namespaces (for the MPLS 216*053f45beSAndroid Build Coastguard Worker# tests, this is also where MPLS encapsulation is done), 217*053f45beSAndroid Build Coastguard Worker# * add routes for these IP addresses (or MPLS labels) in the intermediate 218*053f45beSAndroid Build Coastguard Worker# namespaces. 219*053f45beSAndroid Build Coastguard Worker# 220*053f45beSAndroid Build Coastguard Worker# The bareudp encapsulation isn't configured in setup_overlay_*(). That will be 221*053f45beSAndroid Build Coastguard Worker# done just before running the reachability tests. 222*053f45beSAndroid Build Coastguard Worker 223*053f45beSAndroid Build Coastguard Workersetup_overlay_ipv4() 224*053f45beSAndroid Build Coastguard Worker{ 225*053f45beSAndroid Build Coastguard Worker # Add the overlay IP addresses and route them through the veth devices 226*053f45beSAndroid Build Coastguard Worker ip -netns "${NS0}" address add 192.0.2.100/32 dev lo 227*053f45beSAndroid Build Coastguard Worker ip -netns "${NS3}" address add 192.0.2.103/32 dev lo 228*053f45beSAndroid Build Coastguard Worker ip -netns "${NS0}" route add 192.0.2.103/32 src 192.0.2.100 via 192.0.2.11 229*053f45beSAndroid Build Coastguard Worker ip -netns "${NS3}" route add 192.0.2.100/32 src 192.0.2.103 via 192.0.2.32 230*053f45beSAndroid Build Coastguard Worker 231*053f45beSAndroid Build Coastguard Worker # Route the overlay addresses in the intermediate namespaces 232*053f45beSAndroid Build Coastguard Worker # (used after bareudp decapsulation) 233*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS1}" sysctl -qw net.ipv4.ip_forward=1 234*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS2}" sysctl -qw net.ipv4.ip_forward=1 235*053f45beSAndroid Build Coastguard Worker ip -netns "${NS1}" route add 192.0.2.100/32 via 192.0.2.10 236*053f45beSAndroid Build Coastguard Worker ip -netns "${NS2}" route add 192.0.2.103/32 via 192.0.2.33 237*053f45beSAndroid Build Coastguard Worker 238*053f45beSAndroid Build Coastguard Worker # The intermediate namespaces don't have routes for the reverse path, 239*053f45beSAndroid Build Coastguard Worker # as it will be handled by tc. So we need to ensure that rp_filter is 240*053f45beSAndroid Build Coastguard Worker # not going to block the traffic. 241*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS1}" sysctl -qw net.ipv4.conf.all.rp_filter=0 242*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS2}" sysctl -qw net.ipv4.conf.all.rp_filter=0 243*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS1}" sysctl -qw net.ipv4.conf.default.rp_filter=0 244*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS2}" sysctl -qw net.ipv4.conf.default.rp_filter=0 245*053f45beSAndroid Build Coastguard Worker} 246*053f45beSAndroid Build Coastguard Worker 247*053f45beSAndroid Build Coastguard Workersetup_overlay_ipv6() 248*053f45beSAndroid Build Coastguard Worker{ 249*053f45beSAndroid Build Coastguard Worker # Add the overlay IP addresses and route them through the veth devices 250*053f45beSAndroid Build Coastguard Worker ip -netns "${NS0}" address add 2001:db8::100/128 dev lo 251*053f45beSAndroid Build Coastguard Worker ip -netns "${NS3}" address add 2001:db8::103/128 dev lo 252*053f45beSAndroid Build Coastguard Worker ip -netns "${NS0}" route add 2001:db8::103/128 src 2001:db8::100 via 2001:db8::11 253*053f45beSAndroid Build Coastguard Worker ip -netns "${NS3}" route add 2001:db8::100/128 src 2001:db8::103 via 2001:db8::32 254*053f45beSAndroid Build Coastguard Worker 255*053f45beSAndroid Build Coastguard Worker # Route the overlay addresses in the intermediate namespaces 256*053f45beSAndroid Build Coastguard Worker # (used after bareudp decapsulation) 257*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS1}" sysctl -qw net.ipv6.conf.all.forwarding=1 258*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS2}" sysctl -qw net.ipv6.conf.all.forwarding=1 259*053f45beSAndroid Build Coastguard Worker ip -netns "${NS1}" route add 2001:db8::100/128 via 2001:db8::10 260*053f45beSAndroid Build Coastguard Worker ip -netns "${NS2}" route add 2001:db8::103/128 via 2001:db8::33 261*053f45beSAndroid Build Coastguard Worker} 262*053f45beSAndroid Build Coastguard Worker 263*053f45beSAndroid Build Coastguard Workersetup_overlay_mpls() 264*053f45beSAndroid Build Coastguard Worker{ 265*053f45beSAndroid Build Coastguard Worker # Add specific overlay IP addresses, routed over MPLS 266*053f45beSAndroid Build Coastguard Worker ip -netns "${NS0}" address add 2001:db8::200/128 dev lo 267*053f45beSAndroid Build Coastguard Worker ip -netns "${NS3}" address add 2001:db8::203/128 dev lo 268*053f45beSAndroid Build Coastguard Worker ip -netns "${NS0}" route add 2001:db8::203/128 src 2001:db8::200 encap mpls 203 via 2001:db8::11 269*053f45beSAndroid Build Coastguard Worker ip -netns "${NS3}" route add 2001:db8::200/128 src 2001:db8::203 encap mpls 200 via 2001:db8::32 270*053f45beSAndroid Build Coastguard Worker 271*053f45beSAndroid Build Coastguard Worker # Route the MPLS packets in the intermediate namespaces 272*053f45beSAndroid Build Coastguard Worker # (used after bareudp decapsulation) 273*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS1}" sysctl -qw net.mpls.platform_labels=256 274*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS2}" sysctl -qw net.mpls.platform_labels=256 275*053f45beSAndroid Build Coastguard Worker ip -netns "${NS1}" -family mpls route add 200 via inet6 2001:db8::10 276*053f45beSAndroid Build Coastguard Worker ip -netns "${NS2}" -family mpls route add 203 via inet6 2001:db8::33 277*053f45beSAndroid Build Coastguard Worker} 278*053f45beSAndroid Build Coastguard Worker 279*053f45beSAndroid Build Coastguard Worker# Run "ping" from NS0 and print the result 280*053f45beSAndroid Build Coastguard Worker# 281*053f45beSAndroid Build Coastguard Worker# Parameters: 282*053f45beSAndroid Build Coastguard Worker# 283*053f45beSAndroid Build Coastguard Worker# * $1: the variant of ping to use (normally either "ping" or "ping6"), 284*053f45beSAndroid Build Coastguard Worker# * $2: the IP address to ping, 285*053f45beSAndroid Build Coastguard Worker# * $3: a human readable description of the purpose of the test. 286*053f45beSAndroid Build Coastguard Worker# 287*053f45beSAndroid Build Coastguard Worker# If the test fails and PAUSE_ON_FAIL is active, the user is given the 288*053f45beSAndroid Build Coastguard Worker# possibility to continue with the next test or to quit immediately. 289*053f45beSAndroid Build Coastguard Worker# 290*053f45beSAndroid Build Coastguard Workerping_test_one() 291*053f45beSAndroid Build Coastguard Worker{ 292*053f45beSAndroid Build Coastguard Worker local PING="$1"; readonly PING 293*053f45beSAndroid Build Coastguard Worker local IP="$2"; readonly IP 294*053f45beSAndroid Build Coastguard Worker local MSG="$3"; readonly MSG 295*053f45beSAndroid Build Coastguard Worker local RET 296*053f45beSAndroid Build Coastguard Worker 297*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s " "${MSG}" 298*053f45beSAndroid Build Coastguard Worker 299*053f45beSAndroid Build Coastguard Worker set +e 300*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS0}" "${PING}" -w 5 -c 1 "${IP}" > /dev/null 2>&1 301*053f45beSAndroid Build Coastguard Worker RET=$? 302*053f45beSAndroid Build Coastguard Worker set -e 303*053f45beSAndroid Build Coastguard Worker 304*053f45beSAndroid Build Coastguard Worker if [ "${RET}" -eq 0 ]; then 305*053f45beSAndroid Build Coastguard Worker printf "[ OK ]\n" 306*053f45beSAndroid Build Coastguard Worker else 307*053f45beSAndroid Build Coastguard Worker ERR=1 308*053f45beSAndroid Build Coastguard Worker printf "[FAIL]\n" 309*053f45beSAndroid Build Coastguard Worker if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 310*053f45beSAndroid Build Coastguard Worker printf "\nHit enter to continue, 'q' to quit\n" 311*053f45beSAndroid Build Coastguard Worker read a 312*053f45beSAndroid Build Coastguard Worker if [ "$a" = "q" ]; then 313*053f45beSAndroid Build Coastguard Worker exit 1 314*053f45beSAndroid Build Coastguard Worker fi 315*053f45beSAndroid Build Coastguard Worker fi 316*053f45beSAndroid Build Coastguard Worker fi 317*053f45beSAndroid Build Coastguard Worker} 318*053f45beSAndroid Build Coastguard Worker 319*053f45beSAndroid Build Coastguard Worker# Run reachability tests 320*053f45beSAndroid Build Coastguard Worker# 321*053f45beSAndroid Build Coastguard Worker# Parameters: 322*053f45beSAndroid Build Coastguard Worker# 323*053f45beSAndroid Build Coastguard Worker# * $1: human readable string describing the underlay protocol. 324*053f45beSAndroid Build Coastguard Worker# 325*053f45beSAndroid Build Coastguard Worker# $IPV4, $IPV6, $MPLS_UC and $MULTIPROTO are inherited from the calling 326*053f45beSAndroid Build Coastguard Worker# function. 327*053f45beSAndroid Build Coastguard Worker# 328*053f45beSAndroid Build Coastguard Workerping_test() 329*053f45beSAndroid Build Coastguard Worker{ 330*053f45beSAndroid Build Coastguard Worker local UNDERLAY="$1"; readonly UNDERLAY 331*053f45beSAndroid Build Coastguard Worker local MODE 332*053f45beSAndroid Build Coastguard Worker local MSG 333*053f45beSAndroid Build Coastguard Worker 334*053f45beSAndroid Build Coastguard Worker if [ "${MULTIPROTO}" = "multiproto" ]; then 335*053f45beSAndroid Build Coastguard Worker MODE=" (multiproto mode)" 336*053f45beSAndroid Build Coastguard Worker else 337*053f45beSAndroid Build Coastguard Worker MODE="" 338*053f45beSAndroid Build Coastguard Worker fi 339*053f45beSAndroid Build Coastguard Worker 340*053f45beSAndroid Build Coastguard Worker if [ $IPV4 ]; then 341*053f45beSAndroid Build Coastguard Worker ping_test_one "ping" "192.0.2.103" "IPv4 packets over ${UNDERLAY}${MODE}" 342*053f45beSAndroid Build Coastguard Worker fi 343*053f45beSAndroid Build Coastguard Worker if [ $IPV6 ]; then 344*053f45beSAndroid Build Coastguard Worker ping_test_one "${PING6}" "2001:db8::103" "IPv6 packets over ${UNDERLAY}${MODE}" 345*053f45beSAndroid Build Coastguard Worker fi 346*053f45beSAndroid Build Coastguard Worker if [ $MPLS_UC ]; then 347*053f45beSAndroid Build Coastguard Worker ping_test_one "${PING6}" "2001:db8::203" "Unicast MPLS packets over ${UNDERLAY}${MODE}" 348*053f45beSAndroid Build Coastguard Worker fi 349*053f45beSAndroid Build Coastguard Worker} 350*053f45beSAndroid Build Coastguard Worker 351*053f45beSAndroid Build Coastguard Worker# Set up a bareudp overlay and run reachability tests over IPv4 and IPv6 352*053f45beSAndroid Build Coastguard Worker# 353*053f45beSAndroid Build Coastguard Worker# Parameters: 354*053f45beSAndroid Build Coastguard Worker# 355*053f45beSAndroid Build Coastguard Worker# * $1: the packet type (protocol) to be handled by bareudp, 356*053f45beSAndroid Build Coastguard Worker# * $2: a flag to activate or deactivate bareudp's "multiproto" mode. 357*053f45beSAndroid Build Coastguard Worker# 358*053f45beSAndroid Build Coastguard Workertest_overlay() 359*053f45beSAndroid Build Coastguard Worker{ 360*053f45beSAndroid Build Coastguard Worker local ETHERTYPE="$1"; readonly ETHERTYPE 361*053f45beSAndroid Build Coastguard Worker local MULTIPROTO="$2"; readonly MULTIPROTO 362*053f45beSAndroid Build Coastguard Worker local IPV4 363*053f45beSAndroid Build Coastguard Worker local IPV6 364*053f45beSAndroid Build Coastguard Worker local MPLS_UC 365*053f45beSAndroid Build Coastguard Worker 366*053f45beSAndroid Build Coastguard Worker case "${ETHERTYPE}" in 367*053f45beSAndroid Build Coastguard Worker "ipv4") 368*053f45beSAndroid Build Coastguard Worker IPV4="ipv4" 369*053f45beSAndroid Build Coastguard Worker if [ "${MULTIPROTO}" = "multiproto" ]; then 370*053f45beSAndroid Build Coastguard Worker IPV6="ipv6" 371*053f45beSAndroid Build Coastguard Worker else 372*053f45beSAndroid Build Coastguard Worker IPV6="" 373*053f45beSAndroid Build Coastguard Worker fi 374*053f45beSAndroid Build Coastguard Worker MPLS_UC="" 375*053f45beSAndroid Build Coastguard Worker ;; 376*053f45beSAndroid Build Coastguard Worker "ipv6") 377*053f45beSAndroid Build Coastguard Worker IPV6="ipv6" 378*053f45beSAndroid Build Coastguard Worker IPV4="" 379*053f45beSAndroid Build Coastguard Worker MPLS_UC="" 380*053f45beSAndroid Build Coastguard Worker ;; 381*053f45beSAndroid Build Coastguard Worker "mpls_uc") 382*053f45beSAndroid Build Coastguard Worker MPLS_UC="mpls_uc" 383*053f45beSAndroid Build Coastguard Worker IPV4="" 384*053f45beSAndroid Build Coastguard Worker IPV6="" 385*053f45beSAndroid Build Coastguard Worker ;; 386*053f45beSAndroid Build Coastguard Worker *) 387*053f45beSAndroid Build Coastguard Worker exit 1 388*053f45beSAndroid Build Coastguard Worker ;; 389*053f45beSAndroid Build Coastguard Worker esac 390*053f45beSAndroid Build Coastguard Worker readonly IPV4 391*053f45beSAndroid Build Coastguard Worker readonly IPV6 392*053f45beSAndroid Build Coastguard Worker readonly MPLS_UC 393*053f45beSAndroid Build Coastguard Worker 394*053f45beSAndroid Build Coastguard Worker # Create the bareudp devices in the intermediate namespaces 395*053f45beSAndroid Build Coastguard Worker ip -netns "${NS1}" link add name bareudp_ns1 up type bareudp dstport 6635 ethertype "${ETHERTYPE}" "${MULTIPROTO}" 396*053f45beSAndroid Build Coastguard Worker ip -netns "${NS2}" link add name bareudp_ns2 up type bareudp dstport 6635 ethertype "${ETHERTYPE}" "${MULTIPROTO}" 397*053f45beSAndroid Build Coastguard Worker 398*053f45beSAndroid Build Coastguard Worker # IPv4 over UDPv4 399*053f45beSAndroid Build Coastguard Worker if [ $IPV4 ]; then 400*053f45beSAndroid Build Coastguard Worker # Encapsulation instructions for bareudp over IPv4 401*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" filter add dev veth10 ingress protocol ipv4 \ 402*053f45beSAndroid Build Coastguard Worker flower dst_ip 192.0.2.103/32 \ 403*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 192.0.2.21 dst_ip 192.0.2.22 id 0 \ 404*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns1 405*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" filter add dev veth23 ingress protocol ipv4 \ 406*053f45beSAndroid Build Coastguard Worker flower dst_ip 192.0.2.100/32 \ 407*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 192.0.2.22 dst_ip 192.0.2.21 id 0 \ 408*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns2 409*053f45beSAndroid Build Coastguard Worker fi 410*053f45beSAndroid Build Coastguard Worker 411*053f45beSAndroid Build Coastguard Worker # IPv6 over UDPv4 412*053f45beSAndroid Build Coastguard Worker if [ $IPV6 ]; then 413*053f45beSAndroid Build Coastguard Worker # Encapsulation instructions for bareudp over IPv4 414*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" filter add dev veth10 ingress protocol ipv6 \ 415*053f45beSAndroid Build Coastguard Worker flower dst_ip 2001:db8::103/128 \ 416*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 192.0.2.21 dst_ip 192.0.2.22 id 0 \ 417*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns1 418*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" filter add dev veth23 ingress protocol ipv6 \ 419*053f45beSAndroid Build Coastguard Worker flower dst_ip 2001:db8::100/128 \ 420*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 192.0.2.22 dst_ip 192.0.2.21 id 0 \ 421*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns2 422*053f45beSAndroid Build Coastguard Worker fi 423*053f45beSAndroid Build Coastguard Worker 424*053f45beSAndroid Build Coastguard Worker # MPLS (unicast) over UDPv4 425*053f45beSAndroid Build Coastguard Worker if [ $MPLS_UC ]; then 426*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS1}" sysctl -qw net.mpls.conf.bareudp_ns1.input=1 427*053f45beSAndroid Build Coastguard Worker ip netns exec "${NS2}" sysctl -qw net.mpls.conf.bareudp_ns2.input=1 428*053f45beSAndroid Build Coastguard Worker 429*053f45beSAndroid Build Coastguard Worker # Encapsulation instructions for bareudp over IPv4 430*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" filter add dev veth10 ingress protocol mpls_uc \ 431*053f45beSAndroid Build Coastguard Worker flower mpls_label 203 \ 432*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 192.0.2.21 dst_ip 192.0.2.22 id 0 \ 433*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns1 434*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" filter add dev veth23 ingress protocol mpls_uc \ 435*053f45beSAndroid Build Coastguard Worker flower mpls_label 200 \ 436*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 192.0.2.22 dst_ip 192.0.2.21 id 0 \ 437*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns2 438*053f45beSAndroid Build Coastguard Worker fi 439*053f45beSAndroid Build Coastguard Worker 440*053f45beSAndroid Build Coastguard Worker # Test IPv4 underlay 441*053f45beSAndroid Build Coastguard Worker ping_test "UDPv4" 442*053f45beSAndroid Build Coastguard Worker 443*053f45beSAndroid Build Coastguard Worker # Cleanup bareudp encapsulation instructions, as they were specific to 444*053f45beSAndroid Build Coastguard Worker # the IPv4 underlay, before setting up and testing the IPv6 underlay 445*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" filter delete dev veth10 ingress 446*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" filter delete dev veth23 ingress 447*053f45beSAndroid Build Coastguard Worker 448*053f45beSAndroid Build Coastguard Worker # IPv4 over UDPv6 449*053f45beSAndroid Build Coastguard Worker if [ $IPV4 ]; then 450*053f45beSAndroid Build Coastguard Worker # New encapsulation instructions for bareudp over IPv6 451*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" filter add dev veth10 ingress protocol ipv4 \ 452*053f45beSAndroid Build Coastguard Worker flower dst_ip 192.0.2.103/32 \ 453*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 2001:db8::21 dst_ip 2001:db8::22 id 0 \ 454*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns1 455*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" filter add dev veth23 ingress protocol ipv4 \ 456*053f45beSAndroid Build Coastguard Worker flower dst_ip 192.0.2.100/32 \ 457*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 2001:db8::22 dst_ip 2001:db8::21 id 0 \ 458*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns2 459*053f45beSAndroid Build Coastguard Worker fi 460*053f45beSAndroid Build Coastguard Worker 461*053f45beSAndroid Build Coastguard Worker # IPv6 over UDPv6 462*053f45beSAndroid Build Coastguard Worker if [ $IPV6 ]; then 463*053f45beSAndroid Build Coastguard Worker # New encapsulation instructions for bareudp over IPv6 464*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" filter add dev veth10 ingress protocol ipv6 \ 465*053f45beSAndroid Build Coastguard Worker flower dst_ip 2001:db8::103/128 \ 466*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 2001:db8::21 dst_ip 2001:db8::22 id 0 \ 467*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns1 468*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" filter add dev veth23 ingress protocol ipv6 \ 469*053f45beSAndroid Build Coastguard Worker flower dst_ip 2001:db8::100/128 \ 470*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 2001:db8::22 dst_ip 2001:db8::21 id 0 \ 471*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns2 472*053f45beSAndroid Build Coastguard Worker fi 473*053f45beSAndroid Build Coastguard Worker 474*053f45beSAndroid Build Coastguard Worker # MPLS (unicast) over UDPv6 475*053f45beSAndroid Build Coastguard Worker if [ $MPLS_UC ]; then 476*053f45beSAndroid Build Coastguard Worker # New encapsulation instructions for bareudp over IPv6 477*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" filter add dev veth10 ingress protocol mpls_uc \ 478*053f45beSAndroid Build Coastguard Worker flower mpls_label 203 \ 479*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 2001:db8::21 dst_ip 2001:db8::22 id 0 \ 480*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns1 481*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" filter add dev veth23 ingress protocol mpls_uc \ 482*053f45beSAndroid Build Coastguard Worker flower mpls_label 200 \ 483*053f45beSAndroid Build Coastguard Worker action tunnel_key set src_ip 2001:db8::22 dst_ip 2001:db8::21 id 0 \ 484*053f45beSAndroid Build Coastguard Worker action mirred egress redirect dev bareudp_ns2 485*053f45beSAndroid Build Coastguard Worker fi 486*053f45beSAndroid Build Coastguard Worker 487*053f45beSAndroid Build Coastguard Worker # Test IPv6 underlay 488*053f45beSAndroid Build Coastguard Worker ping_test "UDPv6" 489*053f45beSAndroid Build Coastguard Worker 490*053f45beSAndroid Build Coastguard Worker tc -netns "${NS1}" filter delete dev veth10 ingress 491*053f45beSAndroid Build Coastguard Worker tc -netns "${NS2}" filter delete dev veth23 ingress 492*053f45beSAndroid Build Coastguard Worker ip -netns "${NS1}" link delete bareudp_ns1 493*053f45beSAndroid Build Coastguard Worker ip -netns "${NS2}" link delete bareudp_ns2 494*053f45beSAndroid Build Coastguard Worker} 495*053f45beSAndroid Build Coastguard Worker 496*053f45beSAndroid Build Coastguard Workercheck_features() 497*053f45beSAndroid Build Coastguard Worker{ 498*053f45beSAndroid Build Coastguard Worker ip link help 2>&1 | grep -q bareudp 499*053f45beSAndroid Build Coastguard Worker if [ $? -ne 0 ]; then 500*053f45beSAndroid Build Coastguard Worker echo "Missing bareudp support in iproute2" >&2 501*053f45beSAndroid Build Coastguard Worker exit_cleanup 502*053f45beSAndroid Build Coastguard Worker fi 503*053f45beSAndroid Build Coastguard Worker 504*053f45beSAndroid Build Coastguard Worker # Use ping6 on systems where ping doesn't handle IPv6 505*053f45beSAndroid Build Coastguard Worker ping -w 1 -c 1 ::1 > /dev/null 2>&1 || PING6="ping6" 506*053f45beSAndroid Build Coastguard Worker} 507*053f45beSAndroid Build Coastguard Worker 508*053f45beSAndroid Build Coastguard Workerusage() 509*053f45beSAndroid Build Coastguard Worker{ 510*053f45beSAndroid Build Coastguard Worker echo "Usage: $0 [-p]" 511*053f45beSAndroid Build Coastguard Worker exit 1 512*053f45beSAndroid Build Coastguard Worker} 513*053f45beSAndroid Build Coastguard Worker 514*053f45beSAndroid Build Coastguard Workerwhile getopts :p o 515*053f45beSAndroid Build Coastguard Workerdo 516*053f45beSAndroid Build Coastguard Worker case $o in 517*053f45beSAndroid Build Coastguard Worker p) PAUSE_ON_FAIL="yes";; 518*053f45beSAndroid Build Coastguard Worker *) usage;; 519*053f45beSAndroid Build Coastguard Worker esac 520*053f45beSAndroid Build Coastguard Workerdone 521*053f45beSAndroid Build Coastguard Worker 522*053f45beSAndroid Build Coastguard Workercheck_features 523*053f45beSAndroid Build Coastguard Worker 524*053f45beSAndroid Build Coastguard Worker# Create namespaces before setting up the exit trap. 525*053f45beSAndroid Build Coastguard Worker# Otherwise, exit_cleanup_all() could delete namespaces that were not created 526*053f45beSAndroid Build Coastguard Worker# by this script. 527*053f45beSAndroid Build Coastguard Workercreate_namespaces 528*053f45beSAndroid Build Coastguard Worker 529*053f45beSAndroid Build Coastguard Workerset -e 530*053f45beSAndroid Build Coastguard Workertrap exit_cleanup_all EXIT 531*053f45beSAndroid Build Coastguard Worker 532*053f45beSAndroid Build Coastguard Workersetup_underlay 533*053f45beSAndroid Build Coastguard Workersetup_overlay_ipv4 534*053f45beSAndroid Build Coastguard Workersetup_overlay_ipv6 535*053f45beSAndroid Build Coastguard Workersetup_overlay_mpls 536*053f45beSAndroid Build Coastguard Worker 537*053f45beSAndroid Build Coastguard Workertest_overlay ipv4 nomultiproto 538*053f45beSAndroid Build Coastguard Workertest_overlay ipv6 nomultiproto 539*053f45beSAndroid Build Coastguard Workertest_overlay ipv4 multiproto 540*053f45beSAndroid Build Coastguard Workertest_overlay mpls_uc nomultiproto 541*053f45beSAndroid Build Coastguard Worker 542*053f45beSAndroid Build Coastguard Workerif [ "${ERR}" -eq 1 ]; then 543*053f45beSAndroid Build Coastguard Worker echo "Some tests failed." >&2 544*053f45beSAndroid Build Coastguard Workerelse 545*053f45beSAndroid Build Coastguard Worker ERR=0 546*053f45beSAndroid Build Coastguard Workerfi 547