From 64e098fe1b071bd9f1da9842a8bf43b8ae758a4d Mon Sep 17 00:00:00 2001 From: Hajime Tazaki Date: Thu, 21 Sep 2017 14:59:30 +0900 Subject: [PATCH] lkl: fix android raw socket issue Android libc calls pipe2(2) inside pipe(2) call so, even if we defined HOOK_CALL_USE_HOST_BEFORE_START(pipe) to use host call of pipe before lkl_running becomes 1, it calls pipe2 introduced by the 'commit 8b791da00565 ("Enabling system calls hijacking when using Node.js applications - tested with lkl only")' and resulting lkl_sys_pipe2() call, which is not ready before lkl_start_kernel(). Similar to 5580682c12d3, accept4(2) and pipe2(2) remove the redundant code in order to avoid the issue. This commit also includes the net-test for android (currently only for arm32) in order to detect this issue. Fixes: 8b791da00565 ("Enabling system calls hijacking when using Node.js applications - tested with lkl only") Signed-off-by: Hajime Tazaki --- tools/lkl/lib/hijack/hijack.c | 10 ------- tools/lkl/tests/Makefile | 1 + tools/lkl/tests/android-test.sh | 1 + tools/lkl/tests/net.sh | 48 ++++++++++++++++++--------------- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/tools/lkl/lib/hijack/hijack.c b/tools/lkl/lib/hijack/hijack.c index 8defe3cd0dc3cb..9bbc248b714d14 100644 --- a/tools/lkl/lib/hijack/hijack.c +++ b/tools/lkl/lib/hijack/hijack.c @@ -161,17 +161,7 @@ HOOK_FD_CALL(vmsplice) HOOK_CALL_USE_HOST_BEFORE_START(pipe); HOOK_CALL_USE_HOST_BEFORE_START(accept4); -int accept4(int fd, struct sockaddr *addr, socklen_t *addrlen, int flags) -{ - return lkl_call(__lkl__NR_accept4, 4, fd, addr, addrlen, flags); -} - - HOOK_CALL_USE_HOST_BEFORE_START(pipe2); -int pipe2(int pipefd[2], int flags) -{ - return lkl_call(__lkl__NR_pipe2, 2, pipefd, flags); -} HOST_CALL(setsockopt); int setsockopt(int fd, int level, int optname, const void *optval, diff --git a/tools/lkl/tests/Makefile b/tools/lkl/tests/Makefile index 05a8c6ac146325..cec15f877ffd8b 100644 --- a/tools/lkl/tests/Makefile +++ b/tools/lkl/tests/Makefile @@ -53,6 +53,7 @@ else test: dd if=/dev/zero of=disk.img bs=1024 count=102400 yes | mkfs.ext4 disk.img >/dev/null + adb root adb shell mkdir -p /data/local/tmp/lkl/bin adb push ../bin/lkl-hijack.sh /data/local/tmp/lkl/bin adb push ../tests ../liblkl-hijack.so /data/local/tmp/lkl/ diff --git a/tools/lkl/tests/android-test.sh b/tools/lkl/tests/android-test.sh index baa7ce515d40d1..59aa8af36a6a73 100755 --- a/tools/lkl/tests/android-test.sh +++ b/tools/lkl/tests/android-test.sh @@ -7,6 +7,7 @@ export PATH=${script_dir}:${PATH} export LKL_ANDROID_TEST=1 export TMPDIR=/data/local/tmp export CONFIG_AUTO_LKL_POSIX_HOST=y +export LKL_TEST_DHCP=1 sed -i "s/\/bin\/bash/\/system\/bin\/sh /" ${script_dir}/../bin/lkl-hijack.sh diff --git a/tools/lkl/tests/net.sh b/tools/lkl/tests/net.sh index 83e14187291e07..52048c0e0ddd91 100755 --- a/tools/lkl/tests/net.sh +++ b/tools/lkl/tests/net.sh @@ -5,39 +5,45 @@ if [ "`printenv CONFIG_AUTO_LKL_POSIX_HOST`" != "y" ] ; then exit 0 fi -IFNAME=`ip route |grep default | awk '{print $5}' | head -n1` -GW=`ip route |grep default | awk '{print $3}' | head -n1` +# android doesn't have sudo +if [ -z ${LKL_ANDROID_TEST} ] ; then + SUDO="sudo" +fi + +TEST_HOST=8.8.8.8 +IFNAME=`ip route get ${TEST_HOST} |head -n1 | cut -d ' ' -f5` +GW=`ip route get ${TEST_HOST} |head -n1 | cut -d ' ' -f3` script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) cd ${script_dir} # And make sure we clean up when we're done function clear_work_dir { - sudo ip link set dev lkl_ptt1 down &> /dev/null || true - sudo ip tuntap del dev lkl_ptt1 mode tap &> /dev/null || true - sudo ip link del dev lkl_vtap0 type macvtap &> /dev/null || true + ${SUDO} ip link set dev lkl_ptt1 down &> /dev/null || true + ${SUDO} ip tuntap del dev lkl_ptt1 mode tap &> /dev/null || true + ${SUDO} ip link del dev lkl_vtap0 type macvtap &> /dev/null || true } trap clear_work_dir EXIT echo "== TAP (LKL net) tests ==" if [ -c /dev/net/tun ]; then - sudo ip link set dev lkl_ptt1 down || true - sudo ip tuntap del dev lkl_ptt1 mode tap || true - sudo ip tuntap add dev lkl_ptt1 mode tap user $USER - sudo ip link set dev lkl_ptt1 up - sudo ip addr add dev lkl_ptt1 192.168.14.1/24 + ${SUDO} ip link set dev lkl_ptt1 down || true + ${SUDO} ip tuntap del dev lkl_ptt1 mode tap || true + ${SUDO} ip tuntap add dev lkl_ptt1 mode tap user $USER + ${SUDO} ip link set dev lkl_ptt1 up + ${SUDO} ip addr add dev lkl_ptt1 192.168.14.1/24 ./net-test tap lkl_ptt1 192.168.14.1 192.168.14.2 24 - sudo ip link set dev lkl_ptt1 down - sudo ip tuntap del dev lkl_ptt1 mode tap + ${SUDO} ip link set dev lkl_ptt1 down + ${SUDO} ip tuntap del dev lkl_ptt1 mode tap fi if ping -c1 -w1 $GW &>/dev/null; then DST=$GW -elif ping -c1 -w1 8.8.8.8 &>/dev/null; then - DST=8.8.8.8 +elif ping -c1 -w1 ${TEST_HOST} &>/dev/null; then + DST=${TEST_HOST} fi if [ -z $LKL_TEST_DHCP ] ; then @@ -45,15 +51,15 @@ if [ -z $LKL_TEST_DHCP ] ; then else if ! [ -z $DST ]; then echo "== RAW socket (LKL net) tests ==" - sudo ip link set dev ${IFNAME} promisc on - sudo ./net-test raw ${IFNAME} ${DST} dhcp - sudo ip link set dev ${IFNAME} promisc off + ${SUDO} ip link set dev ${IFNAME} promisc on + ${SUDO} ./net-test raw ${IFNAME} ${DST} dhcp + ${SUDO} ip link set dev ${IFNAME} promisc off echo "== macvtap (LKL net) tests ==" - sudo ip link add link ${IFNAME} name lkl_vtap0 type macvtap mode passthru + ${SUDO} ip link add link ${IFNAME} name lkl_vtap0 type macvtap mode passthru if ls /dev/tap* > /dev/null 2>&1 ; then - sudo ip link set dev lkl_vtap0 up - sudo chown ${USER} `ls /dev/tap*` + ${SUDO} ip link set dev lkl_vtap0 up + ${SUDO} chown ${USER} `ls /dev/tap*` ./net-test macvtap `ls /dev/tap*` $DST dhcp fi fi @@ -64,5 +70,5 @@ fi # may customize those test commands for your host. if false ; then echo "== DPDK (LKL net) tests ==" - sudo ./net-test dpdk dpdk0 192.168.15.1 192.168.15.2 24 + ${SUDO} ./net-test dpdk dpdk0 192.168.15.1 192.168.15.2 24 fi