gbproxy: Test invalid BVCI from SGSN

This adds a test with a UNITDATA SGSN message that is addressed to an
invalid (unknown) BVCI. The test shows, that the message is echoed to
the SGSN.

Sponsored-by: On-Waves ehf
diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c
index ddc9e0a..a25a9f5 100644
--- a/openbsc/src/gprs/gb_proxy.c
+++ b/openbsc/src/gprs/gb_proxy.c
@@ -800,6 +800,37 @@
 	return 0;
 }
 
+int gbprox_dump_global(FILE *stream, int indent, int verbose)
+{
+	unsigned int i;
+	const struct rate_ctr_group_desc *desc;
+	int rc;
+
+	rc = fprintf(stream, "%*sGbproxy global:\n", indent, "");
+	if (rc < 0)
+		return rc;
+
+	if (!verbose)
+		return 0;
+
+	desc = get_global_ctrg()->desc;
+
+	for (i = 0; i < desc->num_ctr; i++) {
+		struct rate_ctr *ctr = &get_global_ctrg()->ctr[i];
+		if (ctr->current) {
+			rc = fprintf(stream, "%*s    %s: %llu\n",
+				     indent, "",
+				     desc->ctr_desc[i].description,
+				     (long long)ctr->current);
+
+			if (rc < 0)
+				return rc;
+		}
+	}
+
+	return 0;
+}
+
 int gbprox_dump_peers(FILE *stream, int indent, int verbose)
 {
 	struct gbprox_peer *peer;
@@ -808,7 +839,10 @@
 	const struct rate_ctr_group_desc *desc;
 	int rc;
 
-	fprintf(stream, "%*sPeers:\n", indent, "");
+	rc = fprintf(stream, "%*sPeers:\n", indent, "");
+	if (rc < 0)
+		return rc;
+
 	llist_for_each_entry(peer, &gbprox_bts_peers, list) {
 		gsm48_parse_ra(&raid, peer->ra);