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
This commit is contained in:
Oliver Smith 2021-02-19 14:25:34 +01:00
parent fd6f09e0c2
commit 79e48fd3ae
16 changed files with 773 additions and 9 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
.release
/_cache

View File

@ -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:

View File

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

View File

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

View File

@ -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*) \

View File

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

View File

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

View File

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

23
scripts/kernel-test/prepare.sh Executable file
View File

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

View File

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

View File

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

30
scripts/kernel-test/run-qemu.sh Executable file
View File

@ -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)"

View File

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

View File

@ -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"

View File

@ -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 \

View File

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