| #!/bin/bash |
| |
| # Kernel configration 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" |
| # For 3.1 kernels, where devtmpfs is not on by default. |
| OPTIONS="$OPTIONS DEVTMPFS DEVTMPFS_MOUNT" |
| |
| # How many tap interfaces to create. |
| NUMTAPINTERFACES=2 |
| |
| # The root filesystem disk image we'll use. |
| ROOTFS=$(dirname $0)/net_test.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). |
| if [ $ROOTFS.xz -nt $ROOTFS ]; then |
| echo "Deleting $ROOTFS" >&2 |
| rm -f $ROOTFS |
| echo "Uncompressing $ROOTFS.xz" >&2 |
| unxz --keep $ROOTFS.xz |
| fi |
| |
| |
| # 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. |
| 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 |
| |
| # 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 |
| |
| # 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 -j12 linux ARCH=um SUBARCH=x86_64 CROSS_COMPILE= |
| |
| # Get the absolute path to the test file that's being run. |
| dir=/host$(dirname $(readlink -f $0)) |
| |
| # Start the VM. |
| exec ./linux umid=net_test ubda=$(dirname $0)/net_test.rootfs \ |
| mem=512M init=/sbin/net_test.sh net_test=$dir/$test \ |
| $netconfig |