More missing files.
diff --git a/testsuite/lib/generic.sh b/testsuite/lib/generic.sh
new file mode 100644
index 0000000..cc48947
--- /dev/null
+++ b/testsuite/lib/generic.sh
@@ -0,0 +1,88 @@
+
+export DEST="127.0.0.1"
+
+ts_log()
+{
+	echo "$@"
+}
+
+ts_err()
+{
+	ts_log "$@" | tee >> $ERRF
+}
+
+ts_cat()
+{
+	cat "$@"
+}
+
+ts_err_cat()
+{
+	ts_cat "$@" | tee >> $ERRF
+}
+
+ts_tc()
+{
+	SCRIPT=$1; shift
+	DESC=$1; shift
+	TMP_ERR=`mktemp /tmp/tc_testsuite.XXXXXX` || exit
+	TMP_OUT=`mktemp /tmp/tc_testsuite.XXXXXX` || exit
+
+	$TC $@ 2> $TMP_ERR > $TMP_OUT
+
+	if [ -s $TMP_ERR ]; then
+		ts_err "${SCRIPT}: ${DESC} failed:"
+		ts_err "command: $TC $@"
+		ts_err "stderr output:"
+		ts_err_cat $TMP_ERR
+		if [ -s $TMP_OUT ]; then
+			ts_err "stdout output:"
+			ts_err_cat $TMP_OUT
+		fi
+	elif [ -s $TMP_OUT ]; then
+		echo "${SCRIPT}: ${DESC} succeeded with output:"
+		cat $TMP_OUT
+	else
+		echo "${SCRIPT}: ${DESC} succeeded"
+	fi
+
+	rm $TMP_ERR $TMP_OUT
+}
+
+ts_ip()
+{
+	SCRIPT=$1; shift
+	DESC=$1; shift
+	TMP_ERR=`mktemp /tmp/tc_testsuite.XXXXXX` || exit
+	TMP_OUT=`mktemp /tmp/tc_testsuite.XXXXXX` || exit
+
+	$IP $@ 2> $TMP_ERR > $TMP_OUT
+
+	if [ -s $TMP_ERR ]; then
+		ts_err "${SCRIPT}: ${DESC} failed:"
+		ts_err "command: $IP $@"
+		ts_err "stderr output:"
+		ts_err_cat $TMP_ERR
+		if [ -s $TMP_OUT ]; then
+			ts_err "stdout output:"
+			ts_err_cat $TMP_OUT
+		fi
+	elif [ -s $TMP_OUT ]; then
+		echo "${SCRIPT}: ${DESC} succeeded with output:"
+		cat $TMP_OUT
+	else
+		echo "${SCRIPT}: ${DESC} succeeded"
+	fi
+
+	rm $TMP_ERR $TMP_OUT
+}
+
+ts_qdisc_available()
+{
+	HELPOUT=`$TC qdisc add $1 help 2>&1`
+	if [ "`echo $HELPOUT | grep \"^Unknown qdisc\"`" ]; then
+		return 0;
+	else
+		return 1;
+	fi
+}