This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
osmith gerrit-no-reply at lists.osmocom.orgosmith has submitted this change. ( https://gerrit.osmocom.org/c/docker-playground/+/23005 )
Change subject: ttcn3-ggsn-test: add kernel test
......................................................................
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
---
M .gitignore
M README.md
M jenkins-common.sh
M osmo-ggsn-latest/Dockerfile
M osmo-ggsn-master/Dockerfile
A scripts/kernel-test/initrd-build.sh
A scripts/kernel-test/initrd-init.sh
A scripts/kernel-test/kernel-build.sh
A scripts/kernel-test/prepare.sh
A scripts/kernel-test/qemu-ifdown.sh
A scripts/kernel-test/qemu-ifup.sh
A scripts/kernel-test/run-qemu.sh
A ttcn3-ggsn-test/fragment.config
A ttcn3-ggsn-test/initrd-ggsn.sh
M ttcn3-ggsn-test/jenkins.sh
A ttcn3-ggsn-test/osmo-ggsn-kernel-gtp.cfg
16 files changed, 773 insertions(+), 9 deletions(-)
Approvals:
osmith: Verified
laforge: Looks good to me, but someone else must approve
pespin: Looks good to me, approved
diff --git a/.gitignore b/.gitignore
index a16a1a0..0aba0f6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
.release
+
+/_cache
diff --git a/README.md b/README.md
index 925907e..27a589e 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,45 @@
* `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 2d596d6..6c54109 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 @@
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 @@
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 d84dd4e..90b12b9 100644
--- a/osmo-ggsn-latest/Dockerfile
+++ b/osmo-ggsn-latest/Dockerfile
@@ -19,10 +19,20 @@
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 c52939d..72dcafe 100644
--- a/osmo-ggsn-master/Dockerfile
+++ b/osmo-ggsn-master/Dockerfile
@@ -24,13 +24,23 @@
# 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 0000000..cce4de8
--- /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 0000000..1c198b8
--- /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 0000000..d261051
--- /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 0000000..0fc9675
--- /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 0000000..f74f445
--- /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 0000000..809cd4e
--- /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 0000000..0a1824f
--- /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 0000000..8a72dc2
--- /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 0000000..831dfff
--- /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 95cbc2f..c6ea729 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 @@
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 0000000..0288d60
--- /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
--
To view, visit https://gerrit.osmocom.org/c/docker-playground/+/23005
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: docker-playground
Gerrit-Branch: master
Gerrit-Change-Id: I54e752048eed2a170a1cf4e0fd410de255b9de5d
Gerrit-Change-Number: 23005
Gerrit-PatchSet: 6
Gerrit-Owner: osmith <osmith at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: osmith <osmith at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210226/91527d72/attachment.htm>