Change in docker-playground[master]: ttcn3-ggsn-test: add kernel test

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.org
Fri Feb 26 08:34:40 UTC 2021


osmith 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>


More information about the gerrit-log mailing list