From 79e48fd3ae1279eeaa3373d92d343f2dbfae075e Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Fri, 19 Feb 2021 14:25:34 +0100 Subject: [PATCH] ttcn3-ggsn-test: add kernel test Make it possible to run ttcn3-ggsn-test against osmo-ggsn with the GTP kernel module. This feature is enabled by environment variables explained in ttcn3-ggsn-test/jenkins.sh, and can either use the pre-built kernel from Debian, or build a kernel from source. The kernel runs inside QEMU inside the usual osmo-ggsn-master docker image. Thanks to Pau for providing the kernel config and kernel-test scripts that this patch is based on! I ended up modifying them quite a bit to fit the docker use case, and to build the initrd (so we can use the stock debian kernel). Related: OS#3208 Change-Id: I54e752048eed2a170a1cf4e0fd410de255b9de5d --- .gitignore | 2 + README.md | 39 ++++ jenkins-common.sh | 47 +++- osmo-ggsn-latest/Dockerfile | 16 +- osmo-ggsn-master/Dockerfile | 14 +- scripts/kernel-test/initrd-build.sh | 114 ++++++++++ scripts/kernel-test/initrd-init.sh | 38 ++++ scripts/kernel-test/kernel-build.sh | 49 +++++ scripts/kernel-test/prepare.sh | 23 ++ scripts/kernel-test/qemu-ifdown.sh | 9 + scripts/kernel-test/qemu-ifup.sh | 18 ++ scripts/kernel-test/run-qemu.sh | 30 +++ ttcn3-ggsn-test/fragment.config | 268 +++++++++++++++++++++++ ttcn3-ggsn-test/initrd-ggsn.sh | 17 ++ ttcn3-ggsn-test/jenkins.sh | 39 +++- ttcn3-ggsn-test/osmo-ggsn-kernel-gtp.cfg | 59 +++++ 16 files changed, 773 insertions(+), 9 deletions(-) create mode 100755 scripts/kernel-test/initrd-build.sh create mode 100755 scripts/kernel-test/initrd-init.sh create mode 100755 scripts/kernel-test/kernel-build.sh create mode 100755 scripts/kernel-test/prepare.sh create mode 100755 scripts/kernel-test/qemu-ifdown.sh create mode 100755 scripts/kernel-test/qemu-ifup.sh create mode 100755 scripts/kernel-test/run-qemu.sh create mode 100644 ttcn3-ggsn-test/fragment.config create mode 100644 ttcn3-ggsn-test/initrd-ggsn.sh create mode 100644 ttcn3-ggsn-test/osmo-ggsn-kernel-gtp.cfg diff --git a/.gitignore b/.gitignore index a16a1a01..0aba0f6f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .release + +/_cache diff --git a/README.md b/README.md index 925907ea..27a589e5 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,45 @@ Environment variables: * `NO_DOCKER_IMAGE_BUILD`: when set to `1`, it won't try to update the containers (see "caching" below) +## Kernel test +OsmoGGSN can be configured to either run completely in userspace, or to +use the GTP-U kernel module. To test the kernel module, OsmoGGSN and +the kernel module will run with a Linux kernel (either the pre-built +one from Debian, or a custom built one) in QEMU inside docker. As of +writing, `ttcn3-ggsn-test` is the only testsuite where it makes +sense to test kernel modules. But the same environment variables could +be used for other testsuites in the future. + +Environment variables: +* `KERNEL_TEST`: set to 1 to run the SUT in QEMU +* `KERNEL_BUILD`: set to 1 to build the kernel instead of using the + pre-built one +* `KERNEL_REMOTE_NAME`: git remote name (to add multiple git + repositories in the same local linux clone, default: net-next) +* `KERNEL_URL`: git remote url (default: net-next.git on kernel.org) +* `KERNEL_BRANCH` branch to checkout (default: master) + +### Creating kernel config fragments +For the kernel tests, we are storing kernel config fragments in the git +repository instead of full kernel configs. Generate them as follows: + +``` +$ cd _cache/linux +$ cp custom.config .config +$ make olddefconfig +$ cp .config custom-updated.config +$ make defconfig # config to which to diff +$ scripts/diffconfig -m .config custom-updated.config > fragment.config +``` + +Verify that it was done right: +``` +$ make defconfig +$ scripts/kconfig/merge_config.sh -m .config fragment.config +$ make olddefconfig +$ diff .config custom-updated.config # should be the same +``` + ## Building containers manually Most folders in this repository contain a `Dockerfile`. Build a docker container with the same name as the folder like this: diff --git a/jenkins-common.sh b/jenkins-common.sh index 2d596d62..6c541093 100644 --- a/jenkins-common.sh +++ b/jenkins-common.sh @@ -1,3 +1,6 @@ +CACHE_DIR="$(realpath ../_cache)" +KERNEL_TEST_DIR="$(realpath ../scripts/kernel-test)" + docker_image_exists() { test -n "$(docker images -q "$REPO_USER/$1")" } @@ -150,9 +153,10 @@ fix_perms() { echo Fixing permissions docker run --rm \ -v $VOL_BASE_DIR:/data \ + -v $CACHE_DIR:/cache \ --name ${BUILD_TAG}-cleaner \ $REPO_USER/debian-stretch-build \ - chmod -R a+rX /data/ + chmod -R a+rX /data/ /cache/ } collect_logs() { @@ -190,6 +194,47 @@ set_clean_up_trap() { trap clean_up_common EXIT INT TERM 0 } +# Generate the initrd, and optionally build a kernel, for tests that involve +# kernel modules. Boot the kernel once in QEMU inside docker to verify that it +# works. See README.md for description of the KERNEL_* environment variables. +# $1: kernel config base (e.g. defconfig, tinyconfig, allnoconfig) +# $2: path to kernel config fragment +# $3: path to project specific initrd build script, which adds the osmo +# program, kernel modules etc. to the initrd (gets sourced by +# scripts/kernel-test/initrd-build.sh) +# $4: docker image name +# $5-n: (optional) additional arguments to "docker run", like a volume +# containing a config file +kernel_test_prepare() { + local kernel_config_base="$1" + local kernel_config_fragment="$2" + local initrd_project_script="$3" + local docker_image="$4" + shift 4 + + mkdir -p "$CACHE_DIR/kernel-test" + + cp "$kernel_config_fragment" \ + "$CACHE_DIR/kernel-test/fragment.config" + cp "$initrd_project_script" \ + "$CACHE_DIR/kernel-test/initrd-project-script.sh" + + docker run \ + --cap-add=NET_ADMIN \ + --device /dev/kvm:/dev/kvm \ + --device /dev/net/tun:/dev/net/tun \ + -v "$CACHE_DIR:/cache" \ + -v "$KERNEL_TEST_DIR:/kernel-test:ro" \ + -e "KERNEL_BRANCH=$KERNEL_BRANCH" \ + -e "KERNEL_BUILD=$KERNEL_BUILD" \ + -e "KERNEL_CONFIG_BASE=$kernel_config_base" \ + -e "KERNEL_REMOTE_NAME=$KERNEL_REMOTE_NAME" \ + -e "KERNEL_URL=$KERNEL_URL" \ + "$@" \ + "$docker_image" \ + "/kernel-test/prepare.sh" +} + set -x # non-jenkins execution: assume local user name diff --git a/osmo-ggsn-latest/Dockerfile b/osmo-ggsn-latest/Dockerfile index d84dd4e0..90b12b91 100644 --- a/osmo-ggsn-latest/Dockerfile +++ b/osmo-ggsn-latest/Dockerfile @@ -19,10 +19,20 @@ RUN apt-key add /tmp/Release.key && \ echo "deb " $OSMOCOM_REPO " ./" > /etc/apt/sources.list.d/osmocom-latest.list ADD $OSMOCOM_REPO/Release /tmp/Release -RUN apt-get update && \ +# Disable update-initramfs to save time during apt-get install +RUN ln -s /bin/true /usr/local/bin/update-initramfs && \ + apt-get update && \ apt-get install -y --no-install-recommends \ - telnet \ - osmo-ggsn && \ + bc \ + bridge-utils \ + busybox-static \ + ca-certificates \ + libelf-dev \ + linux-image-amd64 \ + osmo-ggsn \ + pax-utils \ + qemu-system-x86 \ + telnet && \ apt-get clean WORKDIR /tmp diff --git a/osmo-ggsn-master/Dockerfile b/osmo-ggsn-master/Dockerfile index c52939de..72dcafe5 100644 --- a/osmo-ggsn-master/Dockerfile +++ b/osmo-ggsn-master/Dockerfile @@ -24,13 +24,23 @@ RUN case "$DISTRO" in \ # unfortunately Dockerfiles don't support a conditional ARG, so we need to add both DPKG + RPM ADD $OSMOCOM_REPO/Release /tmp/Release ADD $OSMOCOM_REPO_MIRROR/repositories/network:/osmocom:/nightly/CentOS_8/repodata/repomd.xml /tmp/repomd.xml +# Disable update-initramfs to save time during apt-get install RUN case "$DISTRO" in \ debian*) \ + ln -s /bin/true /usr/local/bin/update-initramfs && \ apt-get update && \ apt-get install -y --no-install-recommends \ - telnet \ + bc \ + bridge-utils \ + busybox-static \ + ca-certificates \ + libelf-dev \ libgtpnl-dev \ - libosmocore-dev && \ + libosmocore-dev \ + linux-image-amd64 \ + pax-utils \ + qemu-system-x86 \ + telnet && \ apt-get clean \ ;; \ centos*) \ diff --git a/scripts/kernel-test/initrd-build.sh b/scripts/kernel-test/initrd-build.sh new file mode 100755 index 00000000..cce4de8c --- /dev/null +++ b/scripts/kernel-test/initrd-build.sh @@ -0,0 +1,114 @@ +#!/bin/sh -ex + +# Add one or more files to the initramfs, with parent directories +# $@: path to files +initrd_add_file() { + cp -a --parents "$@" /tmp/initrd +} + +# Add kernel module files with dependencies +# $@: kernel module names +initrd_add_mod() { + if [ "$KERNEL_BUILD" = 1 ]; then + # Custom kernel will be built, don't add any modules from the + # distribution's kernel to the initramfs. + return + fi + + local kernel="$(basename /lib/modules/*)" + local files="$(modprobe \ + -a \ + --dry-run \ + --show-depends \ + --set-version="$kernel" \ + "$@" \ + | sort -u \ + | cut -d ' ' -f 2)" + + initrd_add_file $files + + # Save the list of modules, so initrd-init.sh can load all of them + for i in $@; do + echo "$i" >> /tmp/initrd/modules + done +} + +# Add binaries with depending libraries +# $@: paths to binaries +initrd_add_bin() { + local bin + local bin_path + local file + + for bin in "$@"; do + local bin_path="$(which "$bin")" + if [ -z "$bin_path" ]; then + echo "ERROR: file not found: $bin" + exit 1 + fi + + lddtree_out="$(lddtree -l "$bin_path")" + if [ -z "$lddtree_out" ]; then + echo "ERROR: lddtree failed on '$bin_path'" + exit 1 + fi + + for file in $lddtree_out; do + initrd_add_file "$file" + + # Copy resolved symlink + if [ -L "$file" ]; then + initrd_add_file "$(realpath "$file")" + fi + done + done +} + +# Add command to run inside the initramfs +# $@: commands +initrd_add_cmd() { + local i + + if ! [ -e /tmp/initrd/cmd.sh ]; then + echo "#!/bin/sh -ex" > /tmp/initrd/cmd.sh + chmod +x /tmp/initrd/cmd.sh + fi + + for i in "$@"; do + echo "$i" >> /tmp/initrd/cmd.sh + done +} + +mkdir -p /tmp/initrd +cd /tmp/initrd + +mkdir -p \ + dev/net \ + proc \ + sbin \ + sys \ + tmp \ + usr/bin \ + usr/sbin + +initrd_add_bin \ + busybox + +initrd_add_mod \ + virtio_net \ + virtio_pci + +initrd_add_file \ + /lib/modules/*/modules.dep + +# Required for osmo-ggsn +mknod dev/net/tun c 10 200 + +cp /kernel-test/initrd-init.sh init + +# Add project specific files (e.g. osmo-ggsn and gtp kernel module) +. /cache/kernel-test/initrd-project-script.sh + +find . -print0 \ + | cpio --quiet -o -0 -H newc \ + | gzip -1 > /cache/kernel-test/initrd diff --git a/scripts/kernel-test/initrd-init.sh b/scripts/kernel-test/initrd-init.sh new file mode 100755 index 00000000..1c198b8d --- /dev/null +++ b/scripts/kernel-test/initrd-init.sh @@ -0,0 +1,38 @@ +#!/bin/busybox sh +echo "Running initrd-init.sh" +set -ex + +export HOME=/root +export LD_LIBRARY_PATH=/usr/local/lib +export PATH=/usr/local/bin:/usr/bin:/bin:/sbin:/usr/local/sbin:/usr/sbin +export TERM=screen + +/bin/busybox --install -s + +hostname qemu + +mount -t proc proc /proc +mount -t sysfs sys /sys + +# Load modules from initrd-build.sh:initrd_add_mod() +if [ -e /modules ]; then + cat /modules | xargs -t -n1 modprobe +fi + +ip link set lo up +ip link set eth0 up + +if grep -q SMOKE_TEST /proc/cmdline; then + # Called from scripts/kernel-test/prepare.sh:kernel_smoke_test() to + # verify that the kernel + initramfs boot up properly. Output this + # string instead of running the actual commands. + echo "SMOKE_TEST_SUCCESS" +else + # Run project specific commands, added with initrd_add_cmd (see + # inird-ggsn.sh for example). Use '|| true' to avoid "attempting to + # kill init" kernel panic on failure. + /cmd.sh || true +fi + +# Avoid kernel panic when init exits +poweroff -f diff --git a/scripts/kernel-test/kernel-build.sh b/scripts/kernel-test/kernel-build.sh new file mode 100755 index 00000000..d2610516 --- /dev/null +++ b/scripts/kernel-test/kernel-build.sh @@ -0,0 +1,49 @@ +#!/bin/sh -ex +# Environment variables are described in README.md + +KERNEL_REMOTE_NAME="${KERNEL_REMOTE_NAME:-net-next}" +KERNEL_URL="${KERNEL_URL:-https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git}" +KERNEL_BRANCH="${KERNEL_BRANCH:-master}" +KERNEL_DIR=/cache/linux + + +# Add the kernel repository as git remote, fetch it, checkout the given branch +prepare_git_repo() { + if ! [ -d "$KERNEL_DIR" ]; then + mkdir -p "$KERNEL_DIR" + git -C "$KERNEL_DIR" init + fi + + cd "$KERNEL_DIR" + + if ! git remote | grep -q "^$KERNEL_REMOTE_NAME$"; then + git remote add "$KERNEL_REMOTE_NAME" "$KERNEL_URL" + fi + + git fetch "$KERNEL_REMOTE_NAME" + git checkout "$KERNEL_REMOTE_NAME/$KERNEL_BRANCH" +} + +update_kernel_config() { + local previous="/cache/kernel-test/previous.config" + local fragment="/cache/kernel-test/fragment.config" + + cd "$KERNEL_DIR" + make "$KERNEL_CONFIG_BASE" + scripts/kconfig/merge_config.sh -m .config "$fragment" + make olddefconfig + + if [ -e "$previous" ] && ! diff -q "$previous" .config; then + # Remove everything built with previous config + echo "Kernel config changed, running 'make clean'" + make clean + fi + + cp .config "$previous" +} + +prepare_git_repo +update_kernel_config + +make "-j$(nproc)" +cp arch/x86/boot/bzImage /cache/kernel-test/linux diff --git a/scripts/kernel-test/prepare.sh b/scripts/kernel-test/prepare.sh new file mode 100755 index 00000000..0fc9675b --- /dev/null +++ b/scripts/kernel-test/prepare.sh @@ -0,0 +1,23 @@ +#!/bin/sh -ex +KERNEL_BUILD="${KERNEL_BUILD:-0}" + +# Test if the kernel boots up, and initd code runs through without error +kernel_smoke_test() { + local log=/cache/kernel-test/smoke_test.log + /kernel-test/run-qemu.sh SMOKE_TEST > "$log" 2>&1 || true + if ! grep -q SMOKE_TEST_SUCCESS "$log"; then + cat "$log" + echo "ERROR: failed to boot the kernel and initrd in QEMU!" + exit 1 + fi +} + +/kernel-test/initrd-build.sh + +if [ "$KERNEL_BUILD" = 1 ]; then + /kernel-test/kernel-build.sh +else + cp /boot/vmlinuz-* /cache/kernel-test/linux +fi + +kernel_smoke_test diff --git a/scripts/kernel-test/qemu-ifdown.sh b/scripts/kernel-test/qemu-ifdown.sh new file mode 100755 index 00000000..f74f445b --- /dev/null +++ b/scripts/kernel-test/qemu-ifdown.sh @@ -0,0 +1,9 @@ +#!/bin/sh -e +br=br-test +qemu_if=$1 + +echo "[host] qemu-ifdown: $br and $qemu_if" +set +x + +ip link set "$br" down +brctl delbr $br diff --git a/scripts/kernel-test/qemu-ifup.sh b/scripts/kernel-test/qemu-ifup.sh new file mode 100755 index 00000000..809cd4e0 --- /dev/null +++ b/scripts/kernel-test/qemu-ifup.sh @@ -0,0 +1,18 @@ +#!/bin/sh -e +br=br-test +docker_if=eth0 +qemu_if=$1 + +echo "[host] qemu-ifup: $br, $qemu_if, $docker_if" +set +x + +ip link set "$qemu_if" up + +brctl addbr "$br" +brctl addif "$br" "$qemu_if" +brctl addif "$br" "$docker_if" + +ip link set "$br" up + +ip a +ip route diff --git a/scripts/kernel-test/run-qemu.sh b/scripts/kernel-test/run-qemu.sh new file mode 100755 index 00000000..0a1824f7 --- /dev/null +++ b/scripts/kernel-test/run-qemu.sh @@ -0,0 +1,30 @@ +#!/bin/sh -ex +# Arguments are appended to the kernel cmdline + +random_mac() { + printf "52:54:" + date "+%c %N" | sha1sum | sed 's/\(.\{2\}\)/\1:/g' | cut -d: -f 1-4 +} + +KERNEL_CMDLINE=" + root=/dev/ram0 + console=ttyS0 + panic=-1 + $@ +" + +qemu-system-x86_64 \ + -machine pc,accel=kvm \ + -smp 1 \ + -m 512M \ + -nodefconfig -no-user-config -nodefaults -display none \ + -gdb unix:/cache/kernel-test/gdb.pipe,server,nowait \ + -no-reboot \ + -kernel /cache/kernel-test/linux \ + -initrd /cache/kernel-test/initrd \ + -append "${KERNEL_CMDLINE}" \ + -serial stdio \ + -chardev socket,id=charserial1,path=/cache/kernel-test/gdb-serial.pipe,server,nowait \ + -device isa-serial,chardev=charserial1,id=serial1 \ + -netdev tap,id=nettest,script=/kernel-test/qemu-ifup.sh,downscript=/kernel-test/qemu-ifdown.sh \ + -device virtio-net-pci,netdev=nettest,mac="$(random_mac)" diff --git a/ttcn3-ggsn-test/fragment.config b/ttcn3-ggsn-test/fragment.config new file mode 100644 index 00000000..8a72dc21 --- /dev/null +++ b/ttcn3-ggsn-test/fragment.config @@ -0,0 +1,268 @@ +# CONFIG_ACPI_BGRT is not set +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_SHA1=y +# CONFIG_EFI_STUB is not set +CONFIG_FAILOVER=y +CONFIG_FDDI=y +CONFIG_GTP=y +CONFIG_HAMRADIO=y +CONFIG_HYPERVISOR_GUEST=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_SET=y +CONFIG_LEGACY_VSYSCALL_EMULATE=y +# CONFIG_LEGACY_VSYSCALL_XONLY is not set +CONFIG_LIBCRC32C=y +CONFIG_MICROCODE_OLD_INTERFACE=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_NETFILTER_NETLINK_GLUE_CT=y +CONFIG_NETFILTER_XT_MARK=y +CONFIG_NETFILTER_XT_NAT=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MASQUERADE=y +CONFIG_NET_9P=y +CONFIG_NET_FAILOVER=y +CONFIG_NF_LOG_COMMON=y +CONFIG_NF_LOG_IPV4=y +CONFIG_NF_LOG_IPV6=y +CONFIG_OVERLAY_FS=y +CONFIG_PAGE_REPORTING=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_PCIEAER=y +# CONFIG_R8169 is not set +# CONFIG_RANDOMIZE_BASE is not set +CONFIG_RAS=y +# CONFIG_RCU_TRACE is not set +# CONFIG_REALTEK_PHY is not set +CONFIG_SND_HDA_PREALLOC_SIZE=64 +CONFIG_SND_OSSEMUL=y +# CONFIG_STRICT_DEVMEM is not set +CONFIG_UEVENT_HELPER=y +# CONFIG_USB is not set +CONFIG_VIRTIO_MMIO=y +CONFIG_VIRTIO_PCI=y +CONFIG_9P_FS=y +CONFIG_9P_FS_POSIX_ACL=y +CONFIG_9P_FS_SECURITY=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_ACPI_EXTLOG is not set +# CONFIG_ACRN_GUEST is not set +# CONFIG_AIX_PARTITION is not set +CONFIG_AMIGA_PARTITION=y +CONFIG_ARCH_CPUIDLE_HALTPOLL=y +# CONFIG_ATARI_PARTITION is not set +# CONFIG_AX25 is not set +CONFIG_BALLOON_COMPACTION=y +CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BSD_DISKLABEL=y +# CONFIG_CMDLINE_PARTITION is not set +# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set +CONFIG_CRYPTO_DEV_VIRTIO=y +CONFIG_CRYPTO_ENGINE=y +CONFIG_CRYPTO_LIB_DES=y +# CONFIG_DEFXX is not set +# CONFIG_DRM_VIRTIO_GPU is not set +CONFIG_EDAC=y +# CONFIG_EDAC_AMD64 is not set +# CONFIG_EDAC_DEBUG is not set +CONFIG_EDAC_DECODE_MCE=y +# CONFIG_EDAC_E752X is not set +# CONFIG_EDAC_I10NM is not set +# CONFIG_EDAC_I3000 is not set +# CONFIG_EDAC_I3200 is not set +# CONFIG_EDAC_I5000 is not set +# CONFIG_EDAC_I5100 is not set +# CONFIG_EDAC_I5400 is not set +# CONFIG_EDAC_I7300 is not set +# CONFIG_EDAC_I7CORE is not set +# CONFIG_EDAC_I82975X is not set +# CONFIG_EDAC_IE31200 is not set +# CONFIG_EDAC_IGEN6 is not set +CONFIG_EDAC_LEGACY_SYSFS=y +# CONFIG_EDAC_PND2 is not set +# CONFIG_EDAC_SBRIDGE is not set +# CONFIG_EDAC_SKX is not set +# CONFIG_EDAC_X38 is not set +CONFIG_HALTPOLL_CPUIDLE=y +# CONFIG_HW_RANDOM_VIRTIO is not set +# CONFIG_HYPERV is not set +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_IP6_NF_MATCH_AH is not set +# CONFIG_IP6_NF_MATCH_EUI64 is not set +# CONFIG_IP6_NF_MATCH_FRAG is not set +# CONFIG_IP6_NF_MATCH_HL is not set +# CONFIG_IP6_NF_MATCH_MH is not set +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_RPFILTER is not set +# CONFIG_IP6_NF_MATCH_RT is not set +# CONFIG_IP6_NF_MATCH_SRH is not set +CONFIG_IP6_NF_NAT=y +# CONFIG_IP6_NF_SECURITY is not set +# CONFIG_IP6_NF_TARGET_HL is not set +CONFIG_IP6_NF_TARGET_MASQUERADE=y +# CONFIG_IP6_NF_TARGET_NPT is not set +# CONFIG_IP6_NF_TARGET_SYNPROXY is not set +# CONFIG_IP_NF_ARPTABLES is not set +# CONFIG_IP_NF_MATCH_AH is not set +# CONFIG_IP_NF_MATCH_ECN is not set +# CONFIG_IP_NF_MATCH_RPFILTER is not set +# CONFIG_IP_NF_MATCH_TTL is not set +# CONFIG_IP_NF_SECURITY is not set +# CONFIG_IP_NF_TARGET_CLUSTERIP is not set +# CONFIG_IP_NF_TARGET_ECN is not set +# CONFIG_IP_NF_TARGET_NETMAP is not set +# CONFIG_IP_NF_TARGET_REDIRECT is not set +# CONFIG_IP_NF_TARGET_SYNPROXY is not set +# CONFIG_IP_NF_TARGET_TTL is not set +# CONFIG_IP_SET_BITMAP_IP is not set +# CONFIG_IP_SET_BITMAP_IPMAC is not set +# CONFIG_IP_SET_BITMAP_PORT is not set +# CONFIG_IP_SET_HASH_IP is not set +# CONFIG_IP_SET_HASH_IPMAC is not set +# CONFIG_IP_SET_HASH_IPMARK is not set +# CONFIG_IP_SET_HASH_IPPORT is not set +# CONFIG_IP_SET_HASH_IPPORTIP is not set +# CONFIG_IP_SET_HASH_IPPORTNET is not set +# CONFIG_IP_SET_HASH_MAC is not set +# CONFIG_IP_SET_HASH_NET is not set +# CONFIG_IP_SET_HASH_NETIFACE is not set +# CONFIG_IP_SET_HASH_NETNET is not set +# CONFIG_IP_SET_HASH_NETPORT is not set +# CONFIG_IP_SET_HASH_NETPORTNET is not set +# CONFIG_IP_SET_LIST_SET is not set +CONFIG_IP_SET_MAX=256 +# CONFIG_JAILHOUSE_GUEST is not set +CONFIG_KARMA_PARTITION=y +CONFIG_KVM_GUEST=y +# CONFIG_LDM_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MEMORY_BALLOON=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +# CONFIG_MOUSE_PS2_VMMOUSE is not set +# CONFIG_NETFILTER_NETLINK_ACCT is not set +# CONFIG_NETFILTER_NETLINK_OSF is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +CONFIG_NETFILTER_XT_CONNMARK=y +# CONFIG_NETFILTER_XT_MATCH_BPF is not set +# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set +# CONFIG_NETFILTER_XT_MATCH_CPU is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ECN is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_HELPER is not set +# CONFIG_NETFILTER_XT_MATCH_HL is not set +# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +# CONFIG_NETFILTER_XT_MATCH_L2TP is not set +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_MAC is not set +CONFIG_NETFILTER_XT_MATCH_MARK=y +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set +# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +# CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set +# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set +# CONFIG_NETFILTER_XT_MATCH_STRING is not set +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set +# CONFIG_NETFILTER_XT_MATCH_TIME is not set +# CONFIG_NETFILTER_XT_MATCH_U32 is not set +# CONFIG_NETFILTER_XT_SET is not set +# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set +# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +# CONFIG_NETFILTER_XT_TARGET_HL is not set +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set +# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set +# CONFIG_NETFILTER_XT_TARGET_LED is not set +# CONFIG_NETFILTER_XT_TARGET_MARK is not set +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set +# CONFIG_NETFILTER_XT_TARGET_TEE is not set +# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set +# CONFIG_NET_9P_DEBUG is not set +CONFIG_NET_9P_VIRTIO=y +# CONFIG_NET_ACT_CONNMARK is not set +# CONFIG_NET_ACT_CTINFO is not set +# CONFIG_NET_EMATCH_IPSET is not set +CONFIG_NET_UDP_TUNNEL=y +# CONFIG_NF_CONNTRACK_AMANDA is not set +# CONFIG_NF_CONNTRACK_EVENTS is not set +# CONFIG_NF_CONNTRACK_H323 is not set +CONFIG_NF_CONNTRACK_MARK=y +# CONFIG_NF_CONNTRACK_PPTP is not set +# CONFIG_NF_CONNTRACK_SANE is not set +# CONFIG_NF_CONNTRACK_SNMP is not set +# CONFIG_NF_CONNTRACK_TFTP is not set +# CONFIG_NF_CONNTRACK_TIMEOUT is not set +# CONFIG_NF_CONNTRACK_TIMESTAMP is not set +# CONFIG_NF_CONNTRACK_ZONES is not set +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_OSF_PARTITION=y +# CONFIG_OVERLAY_FS_INDEX is not set +# CONFIG_OVERLAY_FS_METACOPY is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +CONFIG_OVERLAY_FS_REDIRECT_DIR=y +# CONFIG_OVERLAY_FS_XINO_AUTO is not set +CONFIG_PARAVIRT=y +CONFIG_PARAVIRT_CLOCK=y +# CONFIG_PARAVIRT_DEBUG is not set +# CONFIG_PARAVIRT_SPINLOCKS is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +# CONFIG_PCIEAER_INJECT is not set +# CONFIG_PCIE_DPC is not set +# CONFIG_PCIE_ECRC is not set +CONFIG_PTP_1588_CLOCK_KVM=y +# CONFIG_PTP_1588_CLOCK_VMW is not set +# CONFIG_PVH is not set +CONFIG_SGI_PARTITION=y +# CONFIG_SKFP is not set +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_SEQ_MIDI_EVENT=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SOUND_OSS_CORE_PRECLAIM=y +CONFIG_SUN_PARTITION=y +# CONFIG_SYSV68_PARTITION is not set +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +# CONFIG_ULTRIX_PARTITION is not set +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_VIRTIO=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_BLK=y +CONFIG_VIRTIO_INPUT=y +# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set +CONFIG_VIRTIO_NET=y +CONFIG_VIRTIO_PCI_LEGACY=y +CONFIG_X86_HV_CALLBACK_VECTOR=y +# CONFIG_X86_X2APIC is not set +# CONFIG_XEN is not set diff --git a/ttcn3-ggsn-test/initrd-ggsn.sh b/ttcn3-ggsn-test/initrd-ggsn.sh new file mode 100644 index 00000000..831dfff9 --- /dev/null +++ b/ttcn3-ggsn-test/initrd-ggsn.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# Sourced by scripts/kernel-test/initrd-build.sh + +initrd_add_mod \ + gtp \ + tun + +initrd_add_bin \ + osmo-ggsn + +initrd_add_file \ + /data/osmo-ggsn.cfg + +initrd_add_cmd \ + "ip addr add 172.18.3.201/24 brd 172.18.3.255 dev eth0" \ + "ip route add default via 172.18.3.1 dev eth0" \ + "osmo-ggsn -c /data/osmo-ggsn.cfg" diff --git a/ttcn3-ggsn-test/jenkins.sh b/ttcn3-ggsn-test/jenkins.sh index 95cbc2f4..c6ea7299 100755 --- a/ttcn3-ggsn-test/jenkins.sh +++ b/ttcn3-ggsn-test/jenkins.sh @@ -1,6 +1,14 @@ #!/bin/sh +# Environment variables: +# * KERNEL_TEST: set to 1 to run osmo-ggsn with the kernel module in QEMU +# * KERNEL_BUILD: set to 1 to build the kernel instead of using a pre-built one +# * KERNEL_REMOTE_NAME: git remote name (to add multiple repos in the same local linux clone) +# * KERNEL_URL: git remote url +# * KERNEL_BRANCH: branch to checkout . ../jenkins-common.sh + +KERNEL_TEST="${KERNEL_TEST:-0}" IMAGE_SUFFIX="${IMAGE_SUFFIX:-master}" docker_images_require \ "osmo-ggsn-$IMAGE_SUFFIX" \ @@ -13,23 +21,48 @@ mkdir $VOL_BASE_DIR/ggsn-tester cp GGSN_Tests.cfg $VOL_BASE_DIR/ggsn-tester/ mkdir $VOL_BASE_DIR/ggsn -cp osmo-ggsn.cfg $VOL_BASE_DIR/ggsn/ SUBNET=3 network_create $SUBNET # start container with ggsn in background +GGSN_CMD="osmo-ggsn -c /data/osmo-ggsn.cfg" +GGSN_DOCKER_ARGS="" +if [ "$KERNEL_TEST" = "1" ]; then + cp osmo-ggsn-kernel-gtp.cfg $VOL_BASE_DIR/ggsn/osmo-ggsn.cfg + + kernel_test_prepare \ + "defconfig" \ + "fragment.config" \ + "initrd-ggsn.sh" \ + "$REPO_USER/osmo-ggsn-$IMAGE_SUFFIX" \ + -v $VOL_BASE_DIR/ggsn:/data + + GGSN_CMD="/kernel-test/run-qemu.sh" + GGSN_DOCKER_ARGS=" + $(docker_network_params $SUBNET 200) + --device /dev/kvm:/dev/kvm + -v "$KERNEL_TEST_DIR:/kernel-test:ro" + -v "$CACHE_DIR:/cache" + " +else + cp osmo-ggsn.cfg $VOL_BASE_DIR/ggsn/ + + GGSN_DOCKER_ARGS=" + $(docker_network_params $SUBNET 201) + " +fi docker run --cap-add=NET_ADMIN \ --device /dev/net/tun:/dev/net/tun \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --rm \ - $(docker_network_params $SUBNET 201) \ --ulimit core=-1 \ -v $VOL_BASE_DIR/ggsn:/data \ --name ${BUILD_TAG}-ggsn -d \ $DOCKER_ARGS \ + $GGSN_DOCKER_ARGS \ $REPO_USER/osmo-ggsn-$IMAGE_SUFFIX \ - /bin/sh -c "osmo-ggsn -c /data/osmo-ggsn.cfg >/data/osmo-ggsn.log 2>&1" + /bin/sh -c "$GGSN_CMD >/data/osmo-ggsn.log 2>&1" # start docker container with testsuite in foreground docker run --rm \ diff --git a/ttcn3-ggsn-test/osmo-ggsn-kernel-gtp.cfg b/ttcn3-ggsn-test/osmo-ggsn-kernel-gtp.cfg new file mode 100644 index 00000000..0288d609 --- /dev/null +++ b/ttcn3-ggsn-test/osmo-ggsn-kernel-gtp.cfg @@ -0,0 +1,59 @@ +! +! OpenGGSN (0.94.1-adac) configuration saved from vty +!! +! +log gsmtap 172.18.3.202 + logging level set-all debug + logging filter all 1 +! +log stderr + logging filter all 1 + logging color 1 + logging print category 1 + logging timestamp 1 + logging print extended-timestamp 1 + logging level ip info + logging level tun info + logging level ggsn info + logging level sgsn notice + logging level icmp6 debug + logging level lglobal notice + logging level llapd notice + logging level linp notice + logging level lmux notice + logging level lmi notice + logging level lmib notice + logging level lsms notice + logging level lctrl notice + logging level lgtp info + logging level lstats notice + logging level lgsup notice + logging level loap notice + logging level lss7 notice + logging level lsccp notice + logging level lsua notice + logging level lm3ua notice + logging level lmgcp notice +! +stats interval 5 +! +line vty + no login + bind 0.0.0.0 +! +ggsn ggsn0 + gtp state-dir /tmp + gtp bind-ip 172.18.3.201 + apn internet + gtpu-mode kernel-gtp + tun-device tun4 + type-support v4 + ip prefix dynamic 176.16.222.0/24 + ip dns 0 172.18.3.201 + ip dns 1 8.8.8.8 + ip ifconfig 176.16.222.0/24 + no shutdown +# apn inet6 +# apn inet46 + default-apn internet + no shutdown ggsn