3 # Kernel configuration options.
4 OPTIONS=" DEBUG_SPINLOCK DEBUG_ATOMIC_SLEEP DEBUG_MUTEXES DEBUG_RT_MUTEXES"
5 OPTIONS="$OPTIONS IPV6 IPV6_ROUTER_PREF IPV6_MULTIPLE_TABLES IPV6_ROUTE_INFO"
6 OPTIONS="$OPTIONS TUN SYN_COOKIES IP_ADVANCED_ROUTER IP_MULTIPLE_TABLES"
7 OPTIONS="$OPTIONS NETFILTER NETFILTER_ADVANCED NETFILTER_XTABLES"
8 OPTIONS="$OPTIONS NETFILTER_XT_MARK NETFILTER_XT_TARGET_MARK"
9 OPTIONS="$OPTIONS IP_NF_IPTABLES IP_NF_MANGLE"
10 OPTIONS="$OPTIONS IP6_NF_IPTABLES IP6_NF_MANGLE INET6_IPCOMP"
11 OPTIONS="$OPTIONS IPV6_PRIVACY IPV6_OPTIMISTIC_DAD"
12 OPTIONS="$OPTIONS CONFIG_NETFILTER_XT_TARGET_NFLOG"
13 OPTIONS="$OPTIONS CONFIG_NETFILTER_XT_MATCH_QUOTA CONFIG_NETFILTER_XT_MATCH_QUOTA2"
14 OPTIONS="$OPTIONS CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG"
15 OPTIONS="$OPTIONS CONFIG_INET_UDP_DIAG CONFIG_INET_DIAG_DESTROY"
17 # For 3.1 kernels, where devtmpfs is not on by default.
18 OPTIONS="$OPTIONS DEVTMPFS DEVTMPFS_MOUNT"
20 # These two break the flo kernel due to differences in -Werror on recent GCC.
21 DISABLE_OPTIONS=" CONFIG_REISERFS_FS CONFIG_ANDROID_PMEM"
23 # How many TAP interfaces to create to provide the VM with real network access
24 # via the host. This requires privileges (e.g., root access) on the host.
26 # This is not needed to run the tests, but can be used, for example, to allow
27 # the VM to update system packages, or to write tests that need access to a
28 # real network. The VM does not set up networking by default, but it contains a
29 # DHCP client and has the ability to use IPv6 autoconfiguration. This script
30 # does not perform any host-level setup beyond configuring tap interfaces;
31 # configuring IPv4 NAT and/or IPv6 router advertisements or ND proxying must
35 # The root filesystem disk image we'll use.
36 ROOTFS=net_test.rootfs.20150203
37 COMPRESSED_ROOTFS=$ROOTFS.xz
38 URL=https://dl.google.com/dl/android/$COMPRESSED_ROOTFS
40 # Figure out which test to run.
42 echo "Usage: $0 <test>" >&2
49 # Check if we need to uncompress the disk image.
50 # We use xz because it compresses better: to 42M vs 72M (gzip) / 62M (bzip2).
52 if [ ! -f $ROOTFS ]; then
53 echo "Deleting $COMPRESSED_ROOTFS" >&2
54 rm -f $COMPRESSED_ROOTFS
55 echo "Downloading $URL" >&2
57 echo "Uncompressing $COMPRESSED_ROOTFS" >&2
58 unxz $COMPRESSED_ROOTFS
63 # If network access was requested, create NUMTAPINTERFACES tap interfaces on
64 # the host, and prepare UML command line params to use them. The interfaces are
65 # called <user>TAP0, <user>TAP1, on the host, and eth0, eth1, ..., in the VM.
66 if (( $NUMTAPINTERFACES > 0 )); then
70 for id in $(seq 0 $(( NUMTAPINTERFACES - 1 )) ); do
72 tapinterfaces="$tapinterfaces $tap"
73 mac=$(printf fe:fd:00:00:00:%02x $id)
74 netconfig="$netconfig eth$id=tuntap,$tap,$mac"
77 for tap in $tapinterfaces; do
78 if ! ip link list $tap > /dev/null; then
79 echo "Creating tap interface $tap" >&2
80 sudo tunctl -u $USER -t $tap
81 sudo ip link set $tap up
86 if [ -z "$KERNEL_BINARY" ]; then
87 # Exporting ARCH=um SUBARCH=x86_64 doesn't seem to work, as it "sometimes"
88 # (?) results in a 32-bit kernel.
90 # If there's no kernel config at all, create one or UML won't work.
91 [ -f .config ] || make defconfig ARCH=um SUBARCH=x86_64
93 # Enable the kernel config options listed in $OPTIONS.
94 cmdline=${OPTIONS// / -e }
95 ./scripts/config $cmdline
97 # Disable the kernel config options listed in $DISABLE_OPTIONS.
98 cmdline=${DISABLE_OPTIONS// / -d }
99 ./scripts/config $cmdline
101 # olddefconfig doesn't work on old kernels.
102 if ! make olddefconfig ARCH=um SUBARCH=x86_64 CROSS_COMPILE= ; then
105 Warning: "make olddefconfig" failed.
106 Perhaps this kernel is too old to support it.
107 You may get asked lots of questions.
108 Keep enter pressed to accept the defaults.
113 # Compile the kernel.
114 make -j32 linux ARCH=um SUBARCH=x86_64 CROSS_COMPILE=
115 KERNEL_BINARY=./linux
119 # Get the absolute path to the test file that's being run.
120 dir=/host$(dirname $(readlink -f $0))
123 exec $KERNEL_BINARY umid=net_test ubda=$(dirname $0)/$ROOTFS \
124 mem=512M init=/sbin/net_test.sh net_test=$dir/$test \