#!/bin/bash # Kernel configuration options. OPTIONS=" DEBUG_SPINLOCK DEBUG_ATOMIC_SLEEP DEBUG_MUTEXES DEBUG_RT_MUTEXES" OPTIONS="$OPTIONS IPV6 IPV6_ROUTER_PREF IPV6_MULTIPLE_TABLES IPV6_ROUTE_INFO" OPTIONS="$OPTIONS TUN SYN_COOKIES IP_ADVANCED_ROUTER IP_MULTIPLE_TABLES" OPTIONS="$OPTIONS NETFILTER NETFILTER_ADVANCED NETFILTER_XTABLES" OPTIONS="$OPTIONS NETFILTER_XT_MARK NETFILTER_XT_TARGET_MARK" OPTIONS="$OPTIONS IP_NF_IPTABLES IP_NF_MANGLE" OPTIONS="$OPTIONS IP6_NF_IPTABLES IP6_NF_MANGLE INET6_IPCOMP" OPTIONS="$OPTIONS IPV6_PRIVACY IPV6_OPTIMISTIC_DAD" OPTIONS="$OPTIONS CONFIG_NETFILTER_XT_TARGET_NFLOG" OPTIONS="$OPTIONS CONFIG_NETFILTER_XT_MATCH_QUOTA CONFIG_NETFILTER_XT_MATCH_QUOTA2" OPTIONS="$OPTIONS CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG" OPTIONS="$OPTIONS CONFIG_INET_UDP_DIAG CONFIG_INET_DIAG_DESTROY" # For 3.1 kernels, where devtmpfs is not on by default. OPTIONS="$OPTIONS DEVTMPFS DEVTMPFS_MOUNT" # These two break the flo kernel due to differences in -Werror on recent GCC. DISABLE_OPTIONS=" CONFIG_REISERFS_FS CONFIG_ANDROID_PMEM" # How many TAP interfaces to create to provide the VM with real network access # via the host. This requires privileges (e.g., root access) on the host. # # This is not needed to run the tests, but can be used, for example, to allow # the VM to update system packages, or to write tests that need access to a # real network. The VM does not set up networking by default, but it contains a # DHCP client and has the ability to use IPv6 autoconfiguration. This script # does not perform any host-level setup beyond configuring tap interfaces; # configuring IPv4 NAT and/or IPv6 router advertisements or ND proxying must # be done separately. NUMTAPINTERFACES=0 # The root filesystem disk image we'll use. ROOTFS=net_test.rootfs.20150203 COMPRESSED_ROOTFS=$ROOTFS.xz URL=https://dl.google.com/dl/android/$COMPRESSED_ROOTFS # Figure out which test to run. if [ -z "$1" ]; then echo "Usage: $0 <test>" >&2 exit 1 fi test=$1 set -e # Check if we need to uncompress the disk image. # We use xz because it compresses better: to 42M vs 72M (gzip) / 62M (bzip2). cd $(dirname $0) if [ ! -f $ROOTFS ]; then echo "Deleting $COMPRESSED_ROOTFS" >&2 rm -f $COMPRESSED_ROOTFS echo "Downloading $URL" >&2 wget $URL echo "Uncompressing $COMPRESSED_ROOTFS" >&2 unxz $COMPRESSED_ROOTFS fi echo "Using $ROOTFS" cd - # If network access was requested, create NUMTAPINTERFACES tap interfaces on # the host, and prepare UML command line params to use them. The interfaces are # called <user>TAP0, <user>TAP1, on the host, and eth0, eth1, ..., in the VM. if (( $NUMTAPINTERFACES > 0 )); then user=${USER:0:10} tapinterfaces= netconfig= for id in $(seq 0 $(( NUMTAPINTERFACES - 1 )) ); do tap=${user}TAP$id tapinterfaces="$tapinterfaces $tap" mac=$(printf fe:fd:00:00:00:%02x $id) netconfig="$netconfig eth$id=tuntap,$tap,$mac" done for tap in $tapinterfaces; do if ! ip link list $tap > /dev/null; then echo "Creating tap interface $tap" >&2 sudo tunctl -u $USER -t $tap sudo ip link set $tap up fi done fi if [ -z "$KERNEL_BINARY" ]; then # Exporting ARCH=um SUBARCH=x86_64 doesn't seem to work, as it "sometimes" # (?) results in a 32-bit kernel. # If there's no kernel config at all, create one or UML won't work. [ -f .config ] || make defconfig ARCH=um SUBARCH=x86_64 # Enable the kernel config options listed in $OPTIONS. cmdline=${OPTIONS// / -e } ./scripts/config $cmdline # Disable the kernel config options listed in $DISABLE_OPTIONS. cmdline=${DISABLE_OPTIONS// / -d } ./scripts/config $cmdline # olddefconfig doesn't work on old kernels. if ! make olddefconfig ARCH=um SUBARCH=x86_64 CROSS_COMPILE= ; then cat >&2 << EOF Warning: "make olddefconfig" failed. Perhaps this kernel is too old to support it. You may get asked lots of questions. Keep enter pressed to accept the defaults. EOF fi # Compile the kernel. make -j32 linux ARCH=um SUBARCH=x86_64 CROSS_COMPILE= KERNEL_BINARY=./linux fi # Get the absolute path to the test file that's being run. dir=/host$(dirname $(readlink -f $0)) # Start the VM. exec $KERNEL_BINARY umid=net_test ubda=$(dirname $0)/$ROOTFS \ mem=512M init=/sbin/net_test.sh net_test=$dir/$test \ $netconfig