[1/2] gprs/test: Add BSSGP tests
diff mbox

Message ID 1413443496-6247-1-git-send-email-jerlbeck@sysmocom.de
State Accepted
Headers show

Commit Message

Jacob Erlbeck Oct. 16, 2014, 7:11 a.m. UTC
This patch adds a test suite for the BSSGP protocol.
The first (and only) test checks the handling of BSSGP
SUSPEND/RESUME.

Sponsored-by: On-Waves ehf
---
 tests/Makefile.am           |   8 ++-
 tests/gb/gprs_bssgp_test.c  | 151 ++++++++++++++++++++++++++++++++++++++++++++
 tests/gb/gprs_bssgp_test.ok |   5 ++
 tests/testsuite.at          |   6 ++
 4 files changed, 168 insertions(+), 2 deletions(-)
 create mode 100644 tests/gb/gprs_bssgp_test.c
 create mode 100644 tests/gb/gprs_bssgp_test.ok

Patch
diff mbox

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 3f7db1f..b7ae607 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -5,8 +5,8 @@  check_PROGRAMS = timer/timer_test sms/sms_test ussd/ussd_test		\
                  smscb/smscb_test bits/bitrev_test a5/a5_test		\
                  conv/conv_test auth/milenage_test lapd/lapd_test	\
                  gsm0808/gsm0808_test gsm0408/gsm0408_test		\
-		 gb/bssgp_fc_test gb/gprs_ns_test kasumi/kasumi_test    \
-		 logging/logging_test fr/fr_test	                \
+		 gb/bssgp_fc_test gb/gprs_bssgp_test gb/gprs_ns_test	\
+		 kasumi/kasumi_test logging/logging_test fr/fr_test	\
 		 loggingrb/loggingrb_test strrb/strrb_test              \
 		 vty/vty_test comp128/comp128_test utils/utils_test
 
@@ -62,6 +62,9 @@  ussd_ussd_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gs
 gb_bssgp_fc_test_SOURCES = gb/bssgp_fc_test.c
 gb_bssgp_fc_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gb/libosmogb.la
 
+gb_gprs_bssgp_test_SOURCES = gb/gprs_bssgp_test.c
+gb_gprs_bssgp_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gb/libosmogb.la $(LIBRARY_DL)
+
 gb_gprs_ns_test_SOURCES = gb/gprs_ns_test.c
 gb_gprs_ns_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gb/libosmogb.la $(LIBRARY_DL)
 
@@ -106,6 +109,7 @@  EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE)		\
              lapd/lapd_test.ok gsm0408/gsm0408_test.ok			\
              gsm0808/gsm0808_test.ok gb/bssgp_fc_tests.err		\
              gb/bssgp_fc_tests.ok gb/bssgp_fc_tests.sh			\
+             gb/gprs_bssgp_test.ok					\
              gb/gprs_ns_test.ok kasumi/kasumi_test.ok			\
              msgfile/msgfile_test.ok msgfile/msgconfig.cfg		\
              logging/logging_test.ok logging/logging_test.err		\
diff --git a/tests/gb/gprs_bssgp_test.c b/tests/gb/gprs_bssgp_test.c
new file mode 100644
index 0000000..a2a4068
--- /dev/null
+++ b/tests/gb/gprs_bssgp_test.c
@@ -0,0 +1,151 @@ 
+/* Test routines for the BSSGP implementation in libosmogb
+ *
+ * (C) 2014 by sysmocom s.f.m.c. GmbH
+ * Author: Jacob Erlbeck <jerlbeck@sysmocom.de>
+ *
+ * Skeleton based on bssgp_fc_test.c
+ * (C) 2012 by Harald Welte <laforge@gnumonks.org>
+ */
+
+#undef _GNU_SOURCE
+#define _GNU_SOURCE
+
+#include <osmocom/core/application.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/prim.h>
+#include <osmocom/gprs/gprs_bssgp.h>
+#include <osmocom/gprs/gprs_ns.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <netinet/ip.h>
+#include <dlfcn.h>
+
+#define BSS_NSEI 0x0b55
+
+static struct osmo_prim_hdr last_oph = {0};
+
+/* override */
+ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
+		const struct sockaddr *dest_addr, socklen_t addrlen)
+{
+	typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
+			const struct sockaddr *, socklen_t);
+	static sendto_t real_sendto = NULL;
+	uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
+
+	if (!real_sendto)
+		real_sendto = dlsym(RTLD_NEXT, "sendto");
+
+	fprintf(stderr, "MESSAGE to 0x%08x, msg length %d\n%s\n",
+		dest_host, len, osmo_hexdump(buf, len));
+
+	return len;
+}
+
+/* override */
+int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
+			 struct msgb *msg, uint16_t bvci)
+{
+	fprintf(stderr, "CALLBACK, event %d, msg length %d, bvci 0x%04x\n%s\n\n",
+			event, msgb_bssgp_len(msg), bvci,
+			osmo_hexdump(msgb_bssgph(msg), msgb_bssgp_len(msg)));
+	return 0;
+}
+
+int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx)
+{
+	printf("BSSGP primitive, SAP %d, prim = %d, op = %d, msg = %s\n",
+	       oph->sap, oph->primitive, oph->operation, msgb_hexdump(oph->msg));
+
+	last_oph.sap = oph->sap;
+	last_oph.primitive = oph->primitive;
+	last_oph.operation = oph->operation;
+	last_oph.msg = NULL;
+	return -1;
+}
+
+static void msgb_bssgp_send_and_free(struct msgb *msg)
+{
+	msgb_nsei(msg) = BSS_NSEI;
+
+	bssgp_rcvmsg(msg);
+
+	msgb_free(msg);
+}
+
+static void send_bssgp_supend(enum bssgp_pdu_type pdu_type, uint32_t tlli)
+{
+	struct msgb *msg = bssgp_msgb_alloc();
+	uint32_t tlli_be = htonl(tlli);
+	uint8_t rai[] = {0x0f, 0xf1, 0x80, 0x20, 0x37, 0x00};
+
+	msgb_v_put(msg, pdu_type);
+	msgb_tvlv_put(msg, BSSGP_IE_TLLI, sizeof(tlli_be), (uint8_t *)&tlli_be);
+	msgb_tvlv_put(msg, BSSGP_IE_ROUTEING_AREA, sizeof(rai), &rai[0]);
+
+	msgb_bssgp_send_and_free(msg);
+}
+
+static void send_bssgp_resume(enum bssgp_pdu_type pdu_type, uint32_t tlli)
+{
+	struct msgb *msg = bssgp_msgb_alloc();
+	uint32_t tlli_be = htonl(tlli);
+	uint8_t rai[] = {0x0f, 0xf1, 0x80, 0x20, 0x37, 0x00};
+	uint8_t suspend_ref = 1;
+
+	msgb_v_put(msg, pdu_type);
+	msgb_tvlv_put(msg, BSSGP_IE_TLLI, sizeof(tlli_be), (uint8_t *)&tlli_be);
+	msgb_tvlv_put(msg, BSSGP_IE_ROUTEING_AREA, sizeof(rai), &rai[0]);
+	msgb_tvlv_put(msg, BSSGP_IE_SUSPEND_REF_NR, 1, &suspend_ref);
+
+	msgb_bssgp_send_and_free(msg);
+}
+
+static void test_bssgp_suspend_resume(void)
+{
+	const uint32_t tlli = 0xf0123456;
+
+	printf("----- %s START\n", __func__);
+	memset(&last_oph, 0, sizeof(last_oph));
+
+	send_bssgp_supend(BSSGP_PDUT_SUSPEND, tlli);
+	/* OSMO_ASSERT(last_oph.primitive == PRIM_BSSGP_GMM_SUSPEND); */
+
+	send_bssgp_resume(BSSGP_PDUT_RESUME, tlli);
+	/* OSMO_ASSERT(last_oph.primitive == PRIM_BSSGP_GMM_RESUME); */
+
+	printf("----- %s END\n", __func__);
+}
+
+static struct log_info info = {};
+
+int main(int argc, char **argv)
+{
+	struct sockaddr_in bss_peer= {0};
+
+	osmo_init_logging(&info);
+	log_set_use_color(osmo_stderr_target, 0);
+	log_set_print_filename(osmo_stderr_target, 0);
+
+	bssgp_nsi = gprs_ns_instantiate(gprs_ns_callback, NULL);
+
+	bss_peer.sin_family = AF_INET;
+	bss_peer.sin_port = htons(32000);
+	bss_peer.sin_addr.s_addr = htonl(0x7f0000ff);
+
+	gprs_ns_nsip_connect(bssgp_nsi, &bss_peer, BSS_NSEI, BSS_NSEI+1);
+
+
+	printf("===== BSSGP test START\n");
+	test_bssgp_suspend_resume();
+	printf("===== BSSGP test END\n\n");
+
+	exit(EXIT_SUCCESS);
+}
diff --git a/tests/gb/gprs_bssgp_test.ok b/tests/gb/gprs_bssgp_test.ok
new file mode 100644
index 0000000..9c7b4c0
--- /dev/null
+++ b/tests/gb/gprs_bssgp_test.ok
@@ -0,0 +1,5 @@ 
+===== BSSGP test START
+----- test_bssgp_suspend_resume START
+----- test_bssgp_suspend_resume END
+===== BSSGP test END
+
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 7ce2ee8..fe30363 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -118,6 +118,12 @@  cat $abs_srcdir/vty/vty_test.ok > expout
 AT_CHECK([$abs_top_builddir/tests/vty/vty_test], [0], [expout], [ignore])
 AT_CLEANUP
 
+AT_SETUP([gprs-bssgp])
+AT_KEYWORDS([gprs-bssgp])
+cat $abs_srcdir/gb/gprs_bssgp_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/gb/gprs_bssgp_test], [0], [expout], [ignore])
+AT_CLEANUP
+
 AT_SETUP([gprs-ns])
 AT_KEYWORDS([gprs-ns])
 cat $abs_srcdir/gb/gprs_ns_test.ok > expout