libgb: prefix all NS related functions with gprs_
diff --git a/openbsc/include/osmocom/gprs/gprs_ns.h b/openbsc/include/osmocom/gprs/gprs_ns.h
index a77515d..206873b 100644
--- a/openbsc/include/osmocom/gprs/gprs_ns.h
+++ b/openbsc/include/osmocom/gprs/gprs_ns.h
@@ -211,6 +211,12 @@
 /* Listen for incoming GPRS packets via NS/UDP */
 int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi);
 
+/* Establish a connection (from the BSS) to the SGSN */
+struct gprs_nsvc *gprs_ns_nsip_connect(struct gprs_ns_inst *nsi,
+					struct sockaddr_in *dest,
+					uint16_t nsei, uint16_t nsvci);
+
+
 struct sockaddr_in;
 
 /* main function for higher layers (BSSGP) to send NS messages */
@@ -223,15 +229,10 @@
 /* Listen for incoming GPRS packets via NS/FR/GRE */
 int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi);
 
-/* Establish a connection (from the BSS) to the SGSN */
-struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi,
-				struct sockaddr_in *dest, uint16_t nsei,
-				uint16_t nsvci);
-
-struct gprs_nsvc *nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci);
-void nsvc_delete(struct gprs_nsvc *nsvc);
-struct gprs_nsvc *nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei);
-struct gprs_nsvc *nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci);
+struct gprs_nsvc *gprs_nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci);
+void gprs_nsvc_delete(struct gprs_nsvc *nsvc);
+struct gprs_nsvc *gprs_nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei);
+struct gprs_nsvc *gprs_nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci);
 
 /* Initiate a RESET procedure (including timer start, ...)*/
 void gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause);
diff --git a/openbsc/src/libgb/common_vty.c b/openbsc/src/libgb/common_vty.c
index a16e995..408dddf 100644
--- a/openbsc/src/libgb/common_vty.c
+++ b/openbsc/src/libgb/common_vty.c
@@ -28,6 +28,10 @@
 #include <osmocom/vty/buffer.h>
 #include <osmocom/vty/vty.h>
 
+#include <osmocom/gprs/gprs_msgb.h>
+
+#include "common_vty.h"
+
 /* Down vty node level. */
 gDEFUN(libgb_exit,
        libgb_exit_cmd, "exit", "Exit current mode and down to previous mode\n")
@@ -62,4 +66,24 @@
 	return CMD_SUCCESS;
 }
 
+int gprs_log_filter_fn(const struct log_context *ctx,
+			struct log_target *tar)
+{
+	const struct gprs_nsvc *nsvc = ctx->ctx[GPRS_CTX_NSVC];
+	const struct gprs_nsvc *bvc = ctx->ctx[GPRS_CTX_BVC];
+
+	/* Filter on the NS Virtual Connection */
+	if ((tar->filter_map & (1 << FLT_NSVC)) != 0
+	    && nsvc && (nsvc == tar->filter_data[FLT_NSVC]))
+		return 1;
+
+	/* Filter on the NS Virtual Connection */
+	if ((tar->filter_map & (1 << FLT_BVC)) != 0
+	    && bvc && (bvc == tar->filter_data[FLT_BVC]))
+		return 1;
+
+	return 0;
+}
+
+
 int DNS, DBSSGP;
diff --git a/openbsc/src/libgb/common_vty.h b/openbsc/src/libgb/common_vty.h
index 8c6b9ab..d8d0040 100644
--- a/openbsc/src/libgb/common_vty.h
+++ b/openbsc/src/libgb/common_vty.h
@@ -3,6 +3,12 @@
 
 extern int DNS, DBSSGP;
 
+enum log_filter {
+	_FLT_ALL = LOG_FILTER_ALL,	/* libosmocore */
+	FLT_NSVC = 1,
+	FLT_BVC  = 2,
+};
+
 extern struct cmd_element libgb_exit_cmd;
 extern struct cmd_element libgb_end_cmd;
 
diff --git a/openbsc/src/libgb/gprs_bssgp_vty.c b/openbsc/src/libgb/gprs_bssgp_vty.c
index ff1b8f5..49a90c3 100644
--- a/openbsc/src/libgb/gprs_bssgp_vty.c
+++ b/openbsc/src/libgb/gprs_bssgp_vty.c
@@ -48,6 +48,18 @@
 	{ 0, NULL }
 };
 
+static void log_set_bvc_filter(struct log_target *target,
+				struct bssgp_bvc_ctx *bctx)
+{
+	if (bctx) {
+		target->filter_map |= (1 << FLT_BVC);
+		target->filter_data[FLT_BVC] = bctx;
+	} else if (target->filter_data[FLT_NSVC]) {
+		target->filter_map = ~(1 << FLT_BVC);
+		target->filter_data[FLT_BVC] = NULL;
+	}
+}
+
 static struct cmd_node bssgp_node = {
 	L_BSSGP_NODE,
 	"%s(bssgp)#",
diff --git a/openbsc/src/libgb/gprs_ns.c b/openbsc/src/libgb/gprs_ns.c
index 04a7f10..cdee833 100644
--- a/openbsc/src/libgb/gprs_ns.c
+++ b/openbsc/src/libgb/gprs_ns.c
@@ -121,7 +121,7 @@
  *  \param[in] nsvci NSVCI to be searched
  *  \returns gprs_nsvc of respective NSVCI
  */
-struct gprs_nsvc *nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci)
+struct gprs_nsvc *gprs_nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci)
 {
 	struct gprs_nsvc *nsvc;
 	llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
@@ -136,7 +136,7 @@
  *  \param[in] nsei NSEI to be searched
  *  \returns gprs_nsvc of respective NSEI
  */
-struct gprs_nsvc *nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei)
+struct gprs_nsvc *gprs_nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei)
 {
 	struct gprs_nsvc *nsvc;
 	llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
@@ -162,7 +162,7 @@
 
 static void gprs_ns_timer_cb(void *data);
 
-struct gprs_nsvc *nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci)
+struct gprs_nsvc *gprs_nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci)
 {
 	struct gprs_nsvc *nsvc;
 
@@ -185,7 +185,7 @@
 /*! \brief Delete given NS-VC
  *  \param[in] nsvc gprs_nsvc to be deleted
  */
-void nsvc_delete(struct gprs_nsvc *nsvc)
+void gprs_nsvc_delete(struct gprs_nsvc *nsvc)
 {
 	if (osmo_timer_pending(&nsvc->timer))
 		osmo_timer_del(&nsvc->timer);
@@ -557,7 +557,7 @@
 	struct gprs_ns_hdr *nsh;
 	uint16_t bvci = msgb_bvci(msg);
 
-	nsvc = nsvc_by_nsei(nsi, msgb_nsei(msg));
+	nsvc = gprs_nsvc_by_nsei(nsi, msgb_nsei(msg));
 	if (!nsvc) {
 		LOGP(DNS, LOGL_ERROR, "Unable to resolve NSEI %u "
 			"to NS-VC!\n", msgb_nsei(msg));
@@ -795,9 +795,9 @@
 		nsei = ntohs(*(uint16_t *)TLVP_VAL(&tp, NS_IE_NSEI));
 		/* Check if we already know this NSEI, the remote end might
 		 * simply have changed addresses, or it is a SGSN */
-		nsvc = nsvc_by_nsei(nsi, nsei);
+		nsvc = gprs_nsvc_by_nsei(nsi, nsei);
 		if (!nsvc) {
-			nsvc = nsvc_create(nsi, 0xffff);
+			nsvc = gprs_nsvc_create(nsi, 0xffff);
 			nsvc->ll = ll;
 			log_set_context(GPRS_CTX_NSVC, nsvc);
 			LOGP(DNS, LOGL_INFO, "Creating NS-VC for BSS at %s:%u\n",
@@ -909,7 +909,7 @@
 
 	/* Create the dummy NSVC that we use for sending
 	 * messages to non-existant/unknown NS-VC's */
-	nsi->unknown_nsvc = nsvc_create(nsi, 0xfffe);
+	nsi->unknown_nsvc = gprs_nsvc_create(nsi, 0xfffe);
 	llist_del(&nsi->unknown_nsvc->list);
 
 	return nsi;
@@ -1077,7 +1077,7 @@
  * This function will establish a single NS/UDP/IP connection in uplink
  * (BSS to SGSN) direction.
  */
-struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi,
+struct gprs_nsvc *gprs_ns_nsip_connect(struct gprs_ns_inst *nsi,
 				struct sockaddr_in *dest, uint16_t nsei,
 				uint16_t nsvci)
 {
@@ -1085,7 +1085,7 @@
 
 	nsvc = nsvc_by_rem_addr(nsi, dest);
 	if (!nsvc)
-		nsvc = nsvc_create(nsi, nsvci);
+		nsvc = gprs_nsvc_create(nsi, nsvci);
 	nsvc->ip.bts_addr = *dest;
 	nsvc->nsei = nsei;
 	nsvc->nsvci = nsvci;
diff --git a/openbsc/src/libgb/gprs_ns_vty.c b/openbsc/src/libgb/gprs_ns_vty.c
index 2f0b70a..fac431c 100644
--- a/openbsc/src/libgb/gprs_ns_vty.c
+++ b/openbsc/src/libgb/gprs_ns_vty.c
@@ -57,6 +57,18 @@
 	{ 0, NULL }
 };
 
+static void log_set_nsvc_filter(struct log_target *target,
+				struct gprs_nsvc *nsvc)
+{
+	if (nsvc) {
+		target->filter_map |= (1 << FLT_NSVC);
+		target->filter_data[FLT_NSVC] = nsvc;
+	} else if (target->filter_data[FLT_NSVC]) {
+		target->filter_map = ~(1 << FLT_NSVC);
+		target->filter_data[FLT_NSVC] = NULL;
+	}
+}
+
 static struct cmd_node ns_node = {
 	L_NS_NODE,
 	"%s(ns)#",
@@ -207,9 +219,9 @@
 	int show_stats = 0;
 
 	if (!strcmp(argv[0], "nsei"))
-		nsvc = nsvc_by_nsei(nsi, id);
+		nsvc = gprs_nsvc_by_nsei(nsi, id);
 	else
-		nsvc = nsvc_by_nsvci(nsi, id);
+		nsvc = gprs_nsvc_by_nsvci(nsi, id);
 
 	if (!nsvc) {
 		vty_out(vty, "No such NS Entity%s", VTY_NEWLINE);
@@ -236,9 +248,9 @@
 	uint16_t nsvci = atoi(argv[1]);
 	struct gprs_nsvc *nsvc;
 
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
+	nsvc = gprs_nsvc_by_nsei(vty_nsi, nsei);
 	if (!nsvc) {
-		nsvc = nsvc_create(vty_nsi, nsvci);
+		nsvc = gprs_nsvc_create(vty_nsi, nsvci);
 		nsvc->nsei = nsei;
 	}
 	nsvc->nsvci = nsvci;
@@ -259,7 +271,7 @@
 	uint16_t nsei = atoi(argv[0]);
 	struct gprs_nsvc *nsvc;
 
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
+	nsvc = gprs_nsvc_by_nsei(vty_nsi, nsei);
 	if (!nsvc) {
 		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
 		return CMD_WARNING;
@@ -280,7 +292,7 @@
 	uint16_t port = atoi(argv[1]);
 	struct gprs_nsvc *nsvc;
 
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
+	nsvc = gprs_nsvc_by_nsei(vty_nsi, nsei);
 	if (!nsvc) {
 		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
 		return CMD_WARNING;
@@ -307,7 +319,7 @@
 	uint16_t dlci = atoi(argv[1]);
 	struct gprs_nsvc *nsvc;
 
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
+	nsvc = gprs_nsvc_by_nsei(vty_nsi, nsei);
 	if (!nsvc) {
 		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
 		return CMD_WARNING;
@@ -333,7 +345,7 @@
 	uint16_t nsei = atoi(argv[0]);
 	struct gprs_nsvc *nsvc;
 
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
+	nsvc = gprs_nsvc_by_nsei(vty_nsi, nsei);
 	if (!nsvc) {
 		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
 		return CMD_WARNING;
@@ -358,7 +370,7 @@
 	uint16_t nsei = atoi(argv[0]);
 	struct gprs_nsvc *nsvc;
 
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
+	nsvc = gprs_nsvc_by_nsei(vty_nsi, nsei);
 	if (!nsvc) {
 		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
 		return CMD_WARNING;
@@ -380,7 +392,7 @@
 	uint16_t nsei = atoi(argv[0]);
 	struct gprs_nsvc *nsvc;
 
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
+	nsvc = gprs_nsvc_by_nsei(vty_nsi, nsei);
 	if (!nsvc) {
 		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
 		return CMD_WARNING;
@@ -486,7 +498,7 @@
 	const char *operation = argv[1];
 	struct gprs_nsvc *nsvc;
 
-	nsvc = nsvc_by_nsei(vty_nsi, nsvci);
+	nsvc = gprs_nsvc_by_nsei(vty_nsi, nsvci);
 	if (!nsvc) {
 		vty_out(vty, "No such NSVCI (%u)%s", nsvci, VTY_NEWLINE);
 		return CMD_WARNING;
@@ -521,9 +533,9 @@
 		return CMD_WARNING;
 
 	if (!strcmp(argv[0], "nsei"))
-		nsvc = nsvc_by_nsei(vty_nsi, id);
+		nsvc = gprs_nsvc_by_nsei(vty_nsi, id);
 	else
-		nsvc = nsvc_by_nsvci(vty_nsi, id);
+		nsvc = gprs_nsvc_by_nsvci(vty_nsi, id);
 
 	if (!nsvc) {
 		vty_out(vty, "No NS-VC by that identifier%s", VTY_NEWLINE);
diff --git a/openbsc/src/libgb/libosmo-gb.map b/openbsc/src/libgb/libosmo-gb.map
index ab3c4ea..60f85b2 100644
--- a/openbsc/src/libgb/libosmo-gb.map
+++ b/openbsc/src/libgb/libosmo-gb.map
@@ -37,6 +37,7 @@
 gprs_ns_frgre_sendmsg;
 gprs_ns_instantiate;
 gprs_ns_nsip_listen;
+gprs_ns_nsip_connect;
 gprs_ns_rcvmsg;
 gprs_ns_sendmsg;
 gprs_ns_set_log_ss;
@@ -48,9 +49,12 @@
 gprs_ns_tx_unblock;
 gprs_ns_vty_init;
 
+gprs_nsvc_create;
+gprs_nsvc_delete;
 gprs_nsvc_reset;
+gprs_nsvc_by_nsvci;
+gprs_nsvc_by_nsei;
 
-nsip_connect;
 
 local: *;
 };