diff --git a/gbproxy/GBProxy_Tests.default b/gbproxy/GBProxy_Tests.default index 799ac3255..8634b4916 100644 --- a/gbproxy/GBProxy_Tests.default +++ b/gbproxy/GBProxy_Tests.default @@ -1,3 +1,7 @@ +[DEFINE] +TCPDUMP_START := $TTCN3_HACKS_PATH"/ttcn3-dumpcap-start.sh" +TCPDUMP_STOP := $TTCN3_HACKS_PATH"/ttcn3-dumpcap-stop.sh" + [LOGGING] FileMask := LOG_ALL | TTCN_MATCHING; diff --git a/ttcn3-dumpcap-start.sh b/ttcn3-dumpcap-start.sh new file mode 100755 index 000000000..aa3814a9b --- /dev/null +++ b/ttcn3-dumpcap-start.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# +# contrary to ttcn3-tcpdump-start.sh, this version is dumpcap-only and +# needed when we want to capture from interfaces of different link +# types. It will also store the results as pcap-ng, not plain old pcap. + +PIDFILE_PCAP=/tmp/pcap.pid +DUMPCAP=/usr/bin/dumpcap + +PIDFILE_NETCAT=/tmp/netcat.pid +NETCAT=/bin/nc +GSMTAP_PORT=4729 + +TESTCASE=$1 + +kill_rm_pidfile() { + if [ -e $1 ]; then + kill "$(cat "$1")" + rm $1 + fi +} + +echo "------ $TESTCASE ------" +date + +if [ "z$TTCN3_PCAP_PATH" = "z" ]; then + TTCN3_PCAP_PATH=/tmp +fi + +kill_rm_pidfile $PIDFILE_NETCAT +kill_rm_pidfile $PIDFILE_PCAP + +if [ -x $DUMPCAP ]; then + CAP_ERR="1" + if [ -x /sbin/setcap ]; then + # N. B: this check requires libcap2-bin package + /sbin/setcap -q -v 'cap_net_admin,cap_net_raw=pie' $DUMPCAP + CAP_ERR="$?" + fi + if [ -u $DUMPCAP -o "$CAP_ERR" = "0" ]; then + CMD="$DUMPCAP -q" + else + echo "NOTE: unable to use dumpcap due to missing capabilities or suid bit" + exit 32 + fi +fi + +# Create a dummy sink for GSMTAP packets +$NETCAT -l -u -k -p $GSMTAP_PORT >/dev/null 2>$TESTCASE.netcat.stderr & +PID=$! +echo $PID > $PIDFILE_NETCAT + +# generate the list of interface arguments. For capturing from +# interfaces of different link-layer types, we cannot use "-i all" +# but must use dumpcap with each individual interface name. We also +# must write pcapng files, as only those can record the interface of +# each packet +ADDL_ARGS="" +for f in /sys/class/net/*; do + DEV=`basename $f` + if [[ "$DEV" == "hdlcnet"* ]]; then + # skip these as we only want the hdlcX devices, avoid capturing twice on both sides + continue + elif [[ "$DEV" == "hdlc"* ]]; then + # these are the user-side of the FR links, which is + # what we interface with from our test suite, emulating + # a BSS. + ADDL_ARGS="${ADDL_ARGS} -i ${DEV}" + elif [[ "$DEV" == "eth"* ]]; then + # we blindly assume that "normal" docker network devices + # are called ethXXX + ADDL_ARGS="${ADDL_ARGS} -i ${DEV}" + fi +done + +$CMD -s 1500 -n ${ADDL_ARGS} -w "$TTCN3_PCAP_PATH/$TESTCASE.pcapng" >$TTCN3_PCAP_PATH/$TESTCASE.pcapng.stdout 2>&1 & +PID=$! +echo $PID > $PIDFILE_PCAP + +# Wait until packet dumper creates the pcap file and starts recording. +# We generate some traffic until we see packet dumper catches it. +# Timeout is 10 seconds. +ping 127.0.0.1 >/dev/null 2>&1 & +PID=$! +i=0 +while [ ! -f "$TTCN3_PCAP_PATH/$TESTCASE.pcapng" ] || + [ "$(stat -c '%s' "$TTCN3_PCAP_PATH/$TESTCASE.pcapng")" -eq 32 ] +do + echo "Waiting for packet dumper to start... $i" + sleep 1 + i=$((i+1)) + if [ $i -eq 10 ]; then + break + fi +done +kill $PID diff --git a/ttcn3-dumpcap-stop.sh b/ttcn3-dumpcap-stop.sh new file mode 100755 index 000000000..e13fbc0f4 --- /dev/null +++ b/ttcn3-dumpcap-stop.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +PIDFILE_PCAP=/tmp/pcap.pid +PIDFILE_NETCAT=/tmp/netcat.pid +TESTCASE=$1 +VERDICT="$2" + +kill_rm_pidfile() { +if [ -e $1 ]; then + PSNAME="$(ps -q "$(cat "$1")" -o comm=)" + if [ "$PSNAME" != "sudo" ]; then + kill "$(cat "$1")" + else + # NOTE: This requires you to be root or something like + # "laforge ALL=NOPASSWD: /usr/sbin/tcpdump, /bin/kill" in your sudoers file + sudo kill "$(cat "$1")" + fi + rm $1 +fi +} + +date + +if [ x"$VERDICT" = x"pass" ]; then + echo -e "\033[1;32m====== $TESTCASE $VERDICT ======\033[0m" +else + echo -e "\033[1;31m------ $TESTCASE $VERDICT ------\033[0m" +fi +echo + +if [ "z$TTCN3_PCAP_PATH" = "z" ]; then + TTCN3_PCAP_PATH=/tmp +fi + +# Wait for up to 2 seconds if we keep receiving traffinc from packet dumper, +# otherwise we might lose last packets from test. +i=0 +prev_count=-1 +count=$(stat --format="%s" "$TTCN3_PCAP_PATH/$TESTCASE.pcapng") +while [ $count -gt $prev_count ] && [ $i -lt 2 ] +do + echo "Waiting for packet dumper to finish... $i (prev_count=$prev_count, count=$count)" + sleep 1 + prev_count=$count + count=$(stat --format="%s" "$TTCN3_PCAP_PATH/$TESTCASE.pcapng") + i=$((i+1)) +done + +kill_rm_pidfile "$PIDFILE_PCAP" +kill_rm_pidfile "$PIDFILE_NETCAT" + +gzip -f "$TTCN3_PCAP_PATH/$TESTCASE.pcapng"