diff --git a/openbsc/src/gprs/Makefile.am b/openbsc/src/gprs/Makefile.am
index cdad70f..e981115 100644
--- a/openbsc/src/gprs/Makefile.am
+++ b/openbsc/src/gprs/Makefile.am
@@ -2,7 +2,6 @@
 AM_CFLAGS=-Wall -fno-strict-aliasing $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
 AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(LIBOSMOVTY_LIBS) $(COVERAGE_LDFLAGS)
 
-noinst_LIBRARIES = libgb.a
 noinst_HEADERS = gprs_sndcp.h
 
 if HAVE_LIBGTP
@@ -11,14 +10,10 @@
 bin_PROGRAMS = osmo-gbproxy
 endif
 
-
-libgb_a_SOURCES = gprs_ns.c gprs_ns_frgre.c gprs_ns_vty.c \
-		  gprs_bssgp.c gprs_bssgp_util.c gprs_bssgp_vty.c \
-		  gprs_llc.c gprs_llc_vty.c crc24.c
-
 osmo_gbproxy_SOURCES = gb_proxy.c gb_proxy_main.c gb_proxy_vty.c
-osmo_gbproxy_LDADD = libgb.a $(top_builddir)/src/common/libcommon.a
+osmo_gbproxy_LDADD = $(top_builddir)/src/gb/libgb.a $(top_builddir)/src/common/libcommon.a
 
 osmo_sgsn_SOURCES =	gprs_gmm.c gprs_sgsn.c gprs_sndcp.c gprs_sndcp_vty.c \
-			sgsn_main.c sgsn_vty.c sgsn_libgtp.c 
-osmo_sgsn_LDADD = libgb.a $(top_builddir)/src/common/libcommon.a -lgtp
+			sgsn_main.c sgsn_vty.c sgsn_libgtp.c \
+			gprs_llc.c gprs_llc_vty.c crc24.c
+osmo_sgsn_LDADD = $(top_builddir)/src/gb/libgb.a $(top_builddir)/src/common/libcommon.a -lgtp
diff --git a/openbsc/src/gprs/gprs_bssgp.c b/openbsc/src/gprs/gprs_bssgp.c
deleted file mode 100644
index eca34b9..0000000
--- a/openbsc/src/gprs/gprs_bssgp.c
+++ /dev/null
@@ -1,856 +0,0 @@
-/* GPRS BSSGP protocol implementation as per 3GPP TS 08.18 */
-
-/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * TODO:
- *  o  properly count incoming BVC-RESET packets in counter group
- *  o  set log context as early as possible for outgoing packets
- */
-
-#include <errno.h>
-#include <stdint.h>
-
-#include <netinet/in.h>
-
-#include <osmocore/msgb.h>
-#include <osmocore/tlv.h>
-#include <osmocore/talloc.h>
-#include <osmocore/rate_ctr.h>
-
-#include <openbsc/debug.h>
-#include <openbsc/gsm_data.h>
-#include <openbsc/gsm_04_08_gprs.h>
-#include <openbsc/gprs_bssgp.h>
-#include <openbsc/gprs_llc.h>
-#include <openbsc/gprs_ns.h>
-#include <openbsc/gprs_sgsn.h>
-#include <openbsc/gprs_gmm.h>
-
-void *bssgp_tall_ctx = NULL;
-
-#define BVC_F_BLOCKED	0x0001
-
-enum bssgp_ctr {
-	BSSGP_CTR_PKTS_IN,
-	BSSGP_CTR_PKTS_OUT,
-	BSSGP_CTR_BYTES_IN,
-	BSSGP_CTR_BYTES_OUT,
-	BSSGP_CTR_BLOCKED,
-	BSSGP_CTR_DISCARDED,
-};
-
-static const struct rate_ctr_desc bssgp_ctr_description[] = {
-	{ "packets.in",	"Packets at BSSGP Level ( In)" },
-	{ "packets.out","Packets at BSSGP Level (Out)" },
-	{ "bytes.in",	"Bytes at BSSGP Level   ( In)" },
-	{ "bytes.out",	"Bytes at BSSGP Level   (Out)" },
-	{ "blocked",	"BVC Blocking count" },
-	{ "discarded",	"BVC LLC Discarded count" },
-};
-
-static const struct rate_ctr_group_desc bssgp_ctrg_desc = {
-	.group_name_prefix = "bssgp.bss_ctx",
-	.group_description = "BSSGP Peer Statistics",
-	.num_ctr = ARRAY_SIZE(bssgp_ctr_description),
-	.ctr_desc = bssgp_ctr_description,
-};
-
-LLIST_HEAD(bssgp_bvc_ctxts);
-
-/* Find a BTS Context based on parsed RA ID and Cell ID */
-struct bssgp_bvc_ctx *btsctx_by_raid_cid(const struct gprs_ra_id *raid, uint16_t cid)
-{
-	struct bssgp_bvc_ctx *bctx;
-
-	llist_for_each_entry(bctx, &bssgp_bvc_ctxts, list) {
-		if (!memcmp(&bctx->ra_id, raid, sizeof(bctx->ra_id)) &&
-		    bctx->cell_id == cid)
-			return bctx;
-	}
-	return NULL;
-}
-
-/* Find a BTS context based on BVCI+NSEI tuple */
-struct bssgp_bvc_ctx *btsctx_by_bvci_nsei(uint16_t bvci, uint16_t nsei)
-{
-	struct bssgp_bvc_ctx *bctx;
-
-	llist_for_each_entry(bctx, &bssgp_bvc_ctxts, list) {
-		if (bctx->nsei == nsei && bctx->bvci == bvci)
-			return bctx;
-	}
-	return NULL;
-}
-
-struct bssgp_bvc_ctx *btsctx_alloc(uint16_t bvci, uint16_t nsei)
-{
-	struct bssgp_bvc_ctx *ctx;
-
-	ctx = talloc_zero(bssgp_tall_ctx, struct bssgp_bvc_ctx);
-	if (!ctx)
-		return NULL;
-	ctx->bvci = bvci;
-	ctx->nsei = nsei;
-	/* FIXME: BVCI is not unique, only BVCI+NSEI ?!? */
-	ctx->ctrg = rate_ctr_group_alloc(ctx, &bssgp_ctrg_desc, bvci);
-
-	llist_add(&ctx->list, &bssgp_bvc_ctxts);
-
-	return ctx;
-}
-
-/* Chapter 10.4.5: Flow Control BVC ACK */
-static int bssgp_tx_fc_bvc_ack(uint16_t nsei, uint8_t tag, uint16_t ns_bvci)
-{
-	struct msgb *msg = bssgp_msgb_alloc();
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));
-
-	msgb_nsei(msg) = nsei;
-	msgb_bvci(msg) = ns_bvci;
-
-	bgph->pdu_type = BSSGP_PDUT_FLOW_CONTROL_BVC_ACK;
-	msgb_tvlv_put(msg, BSSGP_IE_TAG, 1, &tag);
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
-
-/* 10.3.7 SUSPEND-ACK PDU */
-int bssgp_tx_suspend_ack(uint16_t nsei, uint32_t tlli,
-			 const struct gprs_ra_id *ra_id, uint8_t suspend_ref)
-{
-	struct msgb *msg = bssgp_msgb_alloc();
-	struct bssgp_normal_hdr *bgph =
-		(struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));
-	uint32_t _tlli;
-	uint8_t ra[6];
-
-	msgb_nsei(msg) = nsei;
-	msgb_bvci(msg) = 0; /* Signalling */
-	bgph->pdu_type = BSSGP_PDUT_SUSPEND_ACK;
-
-	_tlli = htonl(tlli);
-	msgb_tvlv_put(msg, BSSGP_IE_TLLI, 4, (uint8_t *) &_tlli);
-	gsm48_construct_ra(ra, ra_id);
-	msgb_tvlv_put(msg, BSSGP_IE_ROUTEING_AREA, 6, ra);
-	msgb_tvlv_put(msg, BSSGP_IE_SUSPEND_REF_NR, 1, &suspend_ref);
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
-
-/* 10.3.8 SUSPEND-NACK PDU */
-int bssgp_tx_suspend_nack(uint16_t nsei, uint32_t tlli,
-			  const struct gprs_ra_id *ra_id,
-			  uint8_t *cause)
-{
-	struct msgb *msg = bssgp_msgb_alloc();
-	struct bssgp_normal_hdr *bgph =
-		(struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));
-	uint32_t _tlli;
-	uint8_t ra[6];
-
-	msgb_nsei(msg) = nsei;
-	msgb_bvci(msg) = 0; /* Signalling */
-	bgph->pdu_type = BSSGP_PDUT_SUSPEND_NACK;
-
-	_tlli = htonl(tlli);
-	msgb_tvlv_put(msg, BSSGP_IE_TLLI, 4, (uint8_t *) &_tlli);
-	gsm48_construct_ra(ra, ra_id);
-	msgb_tvlv_put(msg, BSSGP_IE_ROUTEING_AREA, 6, ra);
-	if (cause)
-		msgb_tvlv_put(msg, BSSGP_IE_CAUSE, 1, cause);
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
-
-/* 10.3.10 RESUME-ACK PDU */
-int bssgp_tx_resume_ack(uint16_t nsei, uint32_t tlli,
-			const struct gprs_ra_id *ra_id)
-{
-	struct msgb *msg = bssgp_msgb_alloc();
-	struct bssgp_normal_hdr *bgph =
-		(struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));
-	uint32_t _tlli;
-	uint8_t ra[6];
-
-	msgb_nsei(msg) = nsei;
-	msgb_bvci(msg) = 0; /* Signalling */
-	bgph->pdu_type = BSSGP_PDUT_RESUME_ACK;
-
-	_tlli = htonl(tlli);
-	msgb_tvlv_put(msg, BSSGP_IE_TLLI, 4, (uint8_t *) &_tlli);
-	gsm48_construct_ra(ra, ra_id);
-	msgb_tvlv_put(msg, BSSGP_IE_ROUTEING_AREA, 6, ra);
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
-
-/* 10.3.11 RESUME-NACK PDU */
-int bssgp_tx_resume_nack(uint16_t nsei, uint32_t tlli,
-			 const struct gprs_ra_id *ra_id, uint8_t *cause)
-{
-	struct msgb *msg = bssgp_msgb_alloc();
-	struct bssgp_normal_hdr *bgph =
-		(struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));
-	uint32_t _tlli;
-	uint8_t ra[6];
-
-	msgb_nsei(msg) = nsei;
-	msgb_bvci(msg) = 0; /* Signalling */
-	bgph->pdu_type = BSSGP_PDUT_SUSPEND_NACK;
-
-	_tlli = htonl(tlli);
-	msgb_tvlv_put(msg, BSSGP_IE_TLLI, 4, (uint8_t *) &_tlli);
-	gsm48_construct_ra(ra, ra_id);
-	msgb_tvlv_put(msg, BSSGP_IE_ROUTEING_AREA, 6, ra);
-	if (cause)
-		msgb_tvlv_put(msg, BSSGP_IE_CAUSE, 1, cause);
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
-
-uint16_t bssgp_parse_cell_id(struct gprs_ra_id *raid, const uint8_t *buf)
-{
-	/* 6 octets RAC */
-	gsm48_parse_ra(raid, buf);
-	/* 2 octets CID */
-	return ntohs(*(uint16_t *) (buf+6));
-}
-
-/* Chapter 8.4 BVC-Reset Procedure */
-static int bssgp_rx_bvc_reset(struct msgb *msg, struct tlv_parsed *tp,	
-			      uint16_t ns_bvci)
-{
-	struct bssgp_bvc_ctx *bctx;
-	uint16_t nsei = msgb_nsei(msg);
-	uint16_t bvci;
-	int rc;
-
-	bvci = ntohs(*(uint16_t *)TLVP_VAL(tp, BSSGP_IE_BVCI));
-	DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx RESET cause=%s\n", bvci,
-		bssgp_cause_str(*TLVP_VAL(tp, BSSGP_IE_CAUSE)));
-
-	/* look-up or create the BTS context for this BVC */
-	bctx = btsctx_by_bvci_nsei(bvci, nsei);
-	if (!bctx)
-		bctx = btsctx_alloc(bvci, nsei);
-
-	/* As opposed to NS-VCs, BVCs are NOT blocked after RESET */
-	bctx->state &= ~BVC_S_BLOCKED;
-
-	/* When we receive a BVC-RESET PDU (at least of a PTP BVCI), the BSS
-	 * informs us about its RAC + Cell ID, so we can create a mapping */
-	if (bvci != 0 && bvci != 1) {
-		if (!TLVP_PRESENT(tp, BSSGP_IE_CELL_ID)) {
-			LOGP(DBSSGP, LOGL_ERROR, "BSSGP BVCI=%u RESET "
-				"missing mandatory IE\n", bvci);
-			return -EINVAL;
-		}
-		/* actually extract RAC / CID */
-		bctx->cell_id = bssgp_parse_cell_id(&bctx->ra_id,
-						TLVP_VAL(tp, BSSGP_IE_CELL_ID));
-		LOGP(DBSSGP, LOGL_NOTICE, "Cell %u-%u-%u-%u CI %u on BVCI %u\n",
-			bctx->ra_id.mcc, bctx->ra_id.mnc, bctx->ra_id.lac,
-			bctx->ra_id.rac, bctx->cell_id, bvci);
-	}
-
-	/* Acknowledge the RESET to the BTS */
-	rc = bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_RESET_ACK,
-				  nsei, bvci, ns_bvci);
-	return 0;
-}
-
-static int bssgp_rx_bvc_block(struct msgb *msg, struct tlv_parsed *tp)
-{
-	uint16_t bvci;
-	struct bssgp_bvc_ctx *ptp_ctx;
-
-	bvci = ntohs(*(uint16_t *)TLVP_VAL(tp, BSSGP_IE_BVCI));
-	if (bvci == BVCI_SIGNALLING) {
-		/* 8.3.2: Signalling BVC shall never be blocked */
-		LOGP(DBSSGP, LOGL_ERROR, "NSEI=%u/BVCI=%u "
-			"received block for signalling BVC!?!\n",
-			msgb_nsei(msg), msgb_bvci(msg));
-		return 0;
-	}
-
-	LOGP(DBSSGP, LOGL_INFO, "BSSGP BVCI=%u BVC-BLOCK\n", bvci);
-
-	ptp_ctx = btsctx_by_bvci_nsei(bvci, msgb_nsei(msg));
-	if (!ptp_ctx)
-		return bssgp_tx_status(BSSGP_CAUSE_UNKNOWN_BVCI, &bvci, msg);
-
-	ptp_ctx->state |= BVC_S_BLOCKED;
-	rate_ctr_inc(&ptp_ctx->ctrg->ctr[BSSGP_CTR_BLOCKED]);
-
-	/* FIXME: Send NM_BVC_BLOCK.ind to NM */
-
-	/* We always acknowledge the BLOCKing */
-	return bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_BLOCK_ACK, msgb_nsei(msg),
-				    bvci, msgb_bvci(msg));
-};
-
-static int bssgp_rx_bvc_unblock(struct msgb *msg, struct tlv_parsed *tp)
-{
-	uint16_t bvci;
-	struct bssgp_bvc_ctx *ptp_ctx;
-
-	bvci = ntohs(*(uint16_t *)TLVP_VAL(tp, BSSGP_IE_BVCI));
-	if (bvci == BVCI_SIGNALLING) {
-		/* 8.3.2: Signalling BVC shall never be blocked */
-		LOGP(DBSSGP, LOGL_ERROR, "NSEI=%u/BVCI=%u "
-			"received unblock for signalling BVC!?!\n",
-			msgb_nsei(msg), msgb_bvci(msg));
-		return 0;
-	}
-
-	DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx BVC-UNBLOCK\n", bvci);
-
-	ptp_ctx = btsctx_by_bvci_nsei(bvci, msgb_nsei(msg));
-	if (!ptp_ctx)
-		return bssgp_tx_status(BSSGP_CAUSE_UNKNOWN_BVCI, &bvci, msg);
-
-	ptp_ctx->state &= ~BVC_S_BLOCKED;
-
-	/* FIXME: Send NM_BVC_UNBLOCK.ind to NM */
-
-	/* We always acknowledge the unBLOCKing */
-	return bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_UNBLOCK_ACK, msgb_nsei(msg),
-				    bvci, msgb_bvci(msg));
-};
-
-/* Uplink unit-data */
-static int bssgp_rx_ul_ud(struct msgb *msg, struct tlv_parsed *tp,
-			  struct bssgp_bvc_ctx *ctx)
-{
-	struct bssgp_ud_hdr *budh = (struct bssgp_ud_hdr *) msgb_bssgph(msg);
-
-	/* extract TLLI and parse TLV IEs */
-	msgb_tlli(msg) = ntohl(budh->tlli);
-
-	DEBUGP(DBSSGP, "BSSGP TLLI=0x%08x UPLINK-UNITDATA\n", msgb_tlli(msg));
-
-	/* Cell ID and LLC_PDU are the only mandatory IE */
-	if (!TLVP_PRESENT(tp, BSSGP_IE_CELL_ID) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_LLC_PDU)) {
-		LOGP(DBSSGP, LOGL_ERROR, "BSSGP TLLI=0x%08x Rx UL-UD "
-			"missing mandatory IE\n", msgb_tlli(msg));
-		return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE, NULL, msg);
-	}
-
-	/* store pointer to LLC header and CELL ID in msgb->cb */
-	msgb_llch(msg) = (uint8_t *) TLVP_VAL(tp, BSSGP_IE_LLC_PDU);
-	msgb_bcid(msg) = (uint8_t *) TLVP_VAL(tp, BSSGP_IE_CELL_ID);
-
-	return gprs_llc_rcvmsg(msg, tp);
-}
-
-static int bssgp_rx_suspend(struct msgb *msg, struct tlv_parsed *tp,
-			    struct bssgp_bvc_ctx *ctx)
-{
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_bssgph(msg);
-	struct gprs_ra_id raid;
-	uint32_t tlli;
-	int rc;
-
-	if (!TLVP_PRESENT(tp, BSSGP_IE_TLLI) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_ROUTEING_AREA)) {
-		LOGP(DBSSGP, LOGL_ERROR, "BSSGP BVCI=%u Rx SUSPEND "
-			"missing mandatory IE\n", ctx->bvci);
-		return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE, NULL, msg);
-	}
-
-	tlli = ntohl(*(uint32_t *)TLVP_VAL(tp, BSSGP_IE_TLLI));
-
-	DEBUGP(DBSSGP, "BSSGP BVCI=%u TLLI=0x%08x Rx SUSPEND\n",
-		ctx->bvci, tlli);
-
-	gsm48_parse_ra(&raid, TLVP_VAL(tp, BSSGP_IE_ROUTEING_AREA));
-
-	/* Inform GMM about the SUSPEND request */
-	rc = gprs_gmm_rx_suspend(&raid, tlli);
-	if (rc < 0)
-		return bssgp_tx_suspend_nack(msgb_nsei(msg), tlli, &raid, NULL);
-
-	bssgp_tx_suspend_ack(msgb_nsei(msg), tlli, &raid, 0);
-
-	return 0;
-}
-
-static int bssgp_rx_resume(struct msgb *msg, struct tlv_parsed *tp,
-			   struct bssgp_bvc_ctx *ctx)
-{
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_bssgph(msg);
-	struct gprs_ra_id raid;
-	uint32_t tlli;
-	uint8_t suspend_ref;
-	int rc;
-
-	if (!TLVP_PRESENT(tp, BSSGP_IE_TLLI) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_ROUTEING_AREA) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_SUSPEND_REF_NR)) {
-		LOGP(DBSSGP, LOGL_ERROR, "BSSGP BVCI=%u Rx RESUME "
-			"missing mandatory IE\n", ctx->bvci);
-		return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE, NULL, msg);
-	}
-
-	tlli = ntohl(*(uint32_t *)TLVP_VAL(tp, BSSGP_IE_TLLI));
-	suspend_ref = *TLVP_VAL(tp, BSSGP_IE_SUSPEND_REF_NR);
-
-	DEBUGP(DBSSGP, "BSSGP BVCI=%u TLLI=0x%08x RESUME\n", ctx->bvci, tlli);
-
-	gsm48_parse_ra(&raid, TLVP_VAL(tp, BSSGP_IE_ROUTEING_AREA));
-
-	/* Inform GMM about the RESUME request */
-	rc = gprs_gmm_rx_resume(&raid, tlli, suspend_ref);
-	if (rc < 0)
-		return bssgp_tx_resume_nack(msgb_nsei(msg), tlli, &raid,
-					    NULL);
-
-	bssgp_tx_resume_ack(msgb_nsei(msg), tlli, &raid);
-	return 0;
-}
-
-
-static int bssgp_rx_llc_disc(struct msgb *msg, struct tlv_parsed *tp,
-			     struct bssgp_bvc_ctx *ctx)
-{
-	uint32_t tlli = 0;
-
-	if (!TLVP_PRESENT(tp, BSSGP_IE_TLLI) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_LLC_FRAMES_DISCARDED) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_BVCI) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_NUM_OCT_AFF)) {
-		LOGP(DBSSGP, LOGL_ERROR, "BSSGP BVCI=%u Rx LLC DISCARDED "
-			"missing mandatory IE\n", ctx->bvci);
-	}
-
-	if (TLVP_PRESENT(tp, BSSGP_IE_TLLI))
-		tlli = ntohl(*(uint32_t *)TLVP_VAL(tp, BSSGP_IE_TLLI));
-
-	DEBUGP(DBSSGP, "BSSGP BVCI=%u TLLI=%08x LLC DISCARDED\n",
-		ctx->bvci, tlli);
-
-	rate_ctr_inc(&ctx->ctrg->ctr[BSSGP_CTR_DISCARDED]);
-
-	/* FIXME: send NM_LLC_DISCARDED to NM */
-	return 0;
-}
-
-static int bssgp_rx_fc_bvc(struct msgb *msg, struct tlv_parsed *tp,
-			   struct bssgp_bvc_ctx *bctx)
-{
-
-	DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx Flow Control BVC\n",
-		bctx->bvci);
-
-	if (!TLVP_PRESENT(tp, BSSGP_IE_TAG) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_BVC_BUCKET_SIZE) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_BUCKET_LEAK_RATE) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_BMAX_DEFAULT_MS) ||
-	    !TLVP_PRESENT(tp, BSSGP_IE_R_DEFAULT_MS)) {
-		LOGP(DBSSGP, LOGL_ERROR, "BSSGP BVCI=%u Rx FC BVC "
-			"missing mandatory IE\n", bctx->bvci);
-		return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE, NULL, msg);
-	}
-
-	/* FIXME: actually implement flow control */
-
-	/* Send FLOW_CONTROL_BVC_ACK */
-	return bssgp_tx_fc_bvc_ack(msgb_nsei(msg), *TLVP_VAL(tp, BSSGP_IE_TAG),
-				   msgb_bvci(msg));
-}
-
-/* Receive a BSSGP PDU from a BSS on a PTP BVCI */
-static int gprs_bssgp_rx_ptp(struct msgb *msg, struct tlv_parsed *tp,
-			     struct bssgp_bvc_ctx *bctx)
-{
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_bssgph(msg);
-	uint8_t pdu_type = bgph->pdu_type;
-	int rc = 0;
-
-	/* If traffic is received on a BVC that is marked as blocked, the
-	 * received PDU shall not be accepted and a STATUS PDU (Cause value:
-	 * BVC Blocked) shall be sent to the peer entity on the signalling BVC */
-	if (bctx->state & BVC_S_BLOCKED && pdu_type != BSSGP_PDUT_STATUS) {
-		uint16_t bvci = msgb_bvci(msg);
-		return bssgp_tx_status(BSSGP_CAUSE_BVCI_BLOCKED, &bvci, msg);
-	}
-
-	switch (pdu_type) {
-	case BSSGP_PDUT_UL_UNITDATA:
-		/* some LLC data from the MS */
-		rc = bssgp_rx_ul_ud(msg, tp, bctx);
-		break;
-	case BSSGP_PDUT_RA_CAPABILITY:
-		/* BSS requests RA capability or IMSI */
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx RA CAPABILITY UPDATE\n",
-			bctx->bvci);
-		/* FIXME: send GMM_RA_CAPABILITY_UPDATE.ind to GMM */
-		/* FIXME: send RA_CAPA_UPDATE_ACK */
-		break;
-	case BSSGP_PDUT_RADIO_STATUS:
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx RADIO STATUS\n", bctx->bvci);
-		/* BSS informs us of some exception */
-		/* FIXME: send GMM_RADIO_STATUS.ind to GMM */
-		break;
-	case BSSGP_PDUT_FLOW_CONTROL_BVC:
-		/* BSS informs us of available bandwidth in Gb interface */
-		rc = bssgp_rx_fc_bvc(msg, tp, bctx);
-		break;
-	case BSSGP_PDUT_FLOW_CONTROL_MS:
-		/* BSS informs us of available bandwidth to one MS */
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx Flow Control MS\n",
-			bctx->bvci);
-		/* FIXME: actually implement flow control */
-		/* FIXME: Send FLOW_CONTROL_MS_ACK */
-		break;
-	case BSSGP_PDUT_STATUS:
-		/* Some exception has occurred */
-		/* FIXME: send NM_STATUS.ind to NM */
-	case BSSGP_PDUT_DOWNLOAD_BSS_PFC:
-	case BSSGP_PDUT_CREATE_BSS_PFC_ACK:
-	case BSSGP_PDUT_CREATE_BSS_PFC_NACK:
-	case BSSGP_PDUT_MODIFY_BSS_PFC:
-	case BSSGP_PDUT_DELETE_BSS_PFC_ACK:
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type 0x%02x not [yet] "
-			"implemented\n", bctx->bvci, pdu_type);
-		rc = bssgp_tx_status(BSSGP_CAUSE_PDU_INCOMP_FEAT, NULL, msg);
-		break;
-	/* those only exist in the SGSN -> BSS direction */
-	case BSSGP_PDUT_DL_UNITDATA:
-	case BSSGP_PDUT_PAGING_PS:
-	case BSSGP_PDUT_PAGING_CS:
-	case BSSGP_PDUT_RA_CAPA_UPDATE_ACK:
-	case BSSGP_PDUT_FLOW_CONTROL_BVC_ACK:
-	case BSSGP_PDUT_FLOW_CONTROL_MS_ACK:
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u PDU type 0x%02x only exists "
-			"in DL\n", bctx->bvci, pdu_type);
-		bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);
-		rc = -EINVAL;
-		break;
-	default:
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u PDU type 0x%02x unknown\n",
-			bctx->bvci, pdu_type);
-		rc = bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);
-		break;
-	}
-
-	return rc;
-}
-
-/* Receive a BSSGP PDU from a BSS on a SIGNALLING BVCI */
-static int gprs_bssgp_rx_sign(struct msgb *msg, struct tlv_parsed *tp,
-				struct bssgp_bvc_ctx *bctx)
-{
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_bssgph(msg);
-	uint8_t pdu_type = bgph->pdu_type;
-	int rc = 0;
-	uint16_t ns_bvci = msgb_bvci(msg);
-	uint16_t bvci;
-
-	switch (bgph->pdu_type) {
-	case BSSGP_PDUT_SUSPEND:
-		/* MS wants to suspend */
-		rc = bssgp_rx_suspend(msg, tp, bctx);
-		break;
-	case BSSGP_PDUT_RESUME:
-		/* MS wants to resume */
-		rc = bssgp_rx_resume(msg, tp, bctx);
-		break;
-	case BSSGP_PDUT_FLUSH_LL_ACK:
-		/* BSS informs us it has performed LL FLUSH */
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx FLUSH LL ACK\n", bctx->bvci);
-		/* FIXME: send NM_FLUSH_LL.res to NM */
-		break;
-	case BSSGP_PDUT_LLC_DISCARD:
-		/* BSS informs that some LLC PDU's have been discarded */
-		rc = bssgp_rx_llc_disc(msg, tp, bctx);
-		break;
-	case BSSGP_PDUT_BVC_BLOCK:
-		/* BSS tells us that BVC shall be blocked */
-		if (!TLVP_PRESENT(tp, BSSGP_IE_BVCI) ||
-		    !TLVP_PRESENT(tp, BSSGP_IE_CAUSE)) {
-			LOGP(DBSSGP, LOGL_ERROR, "BSSGP Rx BVC-BLOCK "
-				"missing mandatory IE\n");
-			goto err_mand_ie;
-		}
-		rc = bssgp_rx_bvc_block(msg, tp);
-		break;
-	case BSSGP_PDUT_BVC_UNBLOCK:
-		/* BSS tells us that BVC shall be unblocked */
-		if (!TLVP_PRESENT(tp, BSSGP_IE_BVCI)) {
-			LOGP(DBSSGP, LOGL_ERROR, "BSSGP Rx BVC-UNBLOCK "
-				"missing mandatory IE\n");
-			goto err_mand_ie;
-		}
-		rc = bssgp_rx_bvc_unblock(msg, tp);
-		break;
-	case BSSGP_PDUT_BVC_RESET:
-		/* BSS tells us that BVC init is required */
-		if (!TLVP_PRESENT(tp, BSSGP_IE_BVCI) ||
-		    !TLVP_PRESENT(tp, BSSGP_IE_CAUSE)) {
-			LOGP(DBSSGP, LOGL_ERROR, "BSSGP Rx BVC-RESET "
-				"missing mandatory IE\n");
-			goto err_mand_ie;
-		}
-		rc = bssgp_rx_bvc_reset(msg, tp, ns_bvci);
-		break;
-	case BSSGP_PDUT_STATUS:
-		/* Some exception has occurred */
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx BVC STATUS\n", bctx->bvci);
-		/* FIXME: send NM_STATUS.ind to NM */
-		break;
-	/* those only exist in the SGSN -> BSS direction */
-	case BSSGP_PDUT_PAGING_PS:
-	case BSSGP_PDUT_PAGING_CS:
-	case BSSGP_PDUT_SUSPEND_ACK:
-	case BSSGP_PDUT_SUSPEND_NACK:
-	case BSSGP_PDUT_RESUME_ACK:
-	case BSSGP_PDUT_RESUME_NACK:
-	case BSSGP_PDUT_FLUSH_LL:
-	case BSSGP_PDUT_BVC_BLOCK_ACK:
-	case BSSGP_PDUT_BVC_UNBLOCK_ACK:
-	case BSSGP_PDUT_SGSN_INVOKE_TRACE:
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type 0x%02x only exists "
-			"in DL\n", bctx->bvci, pdu_type);
-		bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);
-		rc = -EINVAL;
-		break;
-	default:
-		DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type 0x%02x unknown\n",
-			bctx->bvci, pdu_type);
-		rc = bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);
-		break;
-	}
-
-	return rc;
-err_mand_ie:
-	return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE, NULL, msg);
-}
-
-/* We expect msgb_bssgph() to point to the BSSGP header */
-int gprs_bssgp_rcvmsg(struct msgb *msg)
-{
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_bssgph(msg);
-	struct bssgp_ud_hdr *budh = (struct bssgp_ud_hdr *) msgb_bssgph(msg);
-	struct tlv_parsed tp;
-	struct bssgp_bvc_ctx *bctx;
-	uint8_t pdu_type = bgph->pdu_type;
-	uint16_t ns_bvci = msgb_bvci(msg);
-	int data_len;
-	int rc = 0;
-
-	/* Identifiers from DOWN: NSEI, BVCI (both in msg->cb) */
-
-	/* UNITDATA BSSGP headers have TLLI in front */
-	if (pdu_type != BSSGP_PDUT_UL_UNITDATA &&
-	    pdu_type != BSSGP_PDUT_DL_UNITDATA) {
-		data_len = msgb_bssgp_len(msg) - sizeof(*bgph);
-		rc = bssgp_tlv_parse(&tp, bgph->data, data_len);
-	} else {
-		data_len = msgb_bssgp_len(msg) - sizeof(*budh);
-		rc = bssgp_tlv_parse(&tp, budh->data, data_len);
-	}
-
-	/* look-up or create the BTS context for this BVC */
-	bctx = btsctx_by_bvci_nsei(ns_bvci, msgb_nsei(msg));
-	/* Only a RESET PDU can create a new BVC context */
-	if (!bctx && pdu_type != BSSGP_PDUT_BVC_RESET) {
-		LOGP(DBSSGP, LOGL_NOTICE, "NSEI=%u/BVCI=%u Rejecting PDU "
-			"type %u for unknown BVCI\n", msgb_nsei(msg), ns_bvci,
-			pdu_type);
-		return bssgp_tx_status(BSSGP_CAUSE_UNKNOWN_BVCI, NULL, msg);
-	}
-
-	if (bctx) {
-		log_set_context(BSC_CTX_BVC, bctx);
-		rate_ctr_inc(&bctx->ctrg->ctr[BSSGP_CTR_PKTS_IN]);
-		rate_ctr_add(&bctx->ctrg->ctr[BSSGP_CTR_BYTES_IN],
-			     msgb_bssgp_len(msg));
-	}
-
-	if (ns_bvci == BVCI_SIGNALLING)
-		rc = gprs_bssgp_rx_sign(msg, &tp, bctx);
-	else if (ns_bvci == BVCI_PTM)
-		rc = bssgp_tx_status(BSSGP_CAUSE_PDU_INCOMP_FEAT, NULL, msg);
-	else
-		rc = gprs_bssgp_rx_ptp(msg, &tp, bctx);
-
-	return rc;
-}
-
-/* Entry function from upper level (LLC), asking us to transmit a BSSGP PDU
- * to a remote MS (identified by TLLI) at a BTS identified by its BVCI and NSEI */
-int gprs_bssgp_tx_dl_ud(struct msgb *msg, struct sgsn_mm_ctx *mmctx)
-{
-	struct bssgp_bvc_ctx *bctx;
-	struct bssgp_ud_hdr *budh;
-	uint8_t llc_pdu_tlv_hdr_len = 2;
-	uint8_t *llc_pdu_tlv, *qos_profile;
-	uint16_t pdu_lifetime = 1000; /* centi-seconds */
-	uint8_t qos_profile_default[3] = { 0x00, 0x00, 0x20 };
-	uint16_t msg_len = msg->len;
-	uint16_t bvci = msgb_bvci(msg);
-	uint16_t nsei = msgb_nsei(msg);
-	uint16_t drx_params;
-
-	/* Identifiers from UP: TLLI, BVCI, NSEI (all in msgb->cb) */
-	if (bvci <= BVCI_PTM ) {
-		LOGP(DBSSGP, LOGL_ERROR, "Cannot send DL-UD to BVCI %u\n",
-			bvci);
-		return -EINVAL;
-	}
-
-	bctx = btsctx_by_bvci_nsei(bvci, nsei);
-	if (!bctx) {
-		/* FIXME: don't simply create missing context, but reject message */
-		bctx = btsctx_alloc(bvci, nsei);
-	}
-
-	if (msg->len > TVLV_MAX_ONEBYTE)
-		llc_pdu_tlv_hdr_len += 1;
-
-	/* prepend the tag and length of the LLC-PDU TLV */
-	llc_pdu_tlv = msgb_push(msg, llc_pdu_tlv_hdr_len);
-	llc_pdu_tlv[0] = BSSGP_IE_LLC_PDU;
-	if (llc_pdu_tlv_hdr_len > 2) {
-		llc_pdu_tlv[1] = msg_len >> 8;
-		llc_pdu_tlv[2] = msg_len & 0xff;
-	} else {
-		llc_pdu_tlv[1] = msg_len & 0x7f;
-		llc_pdu_tlv[1] |= 0x80;
-	}
-
-	/* FIXME: optional elements: Alignment, UTRAN CCO, LSA, PFI */
-
-	if (mmctx) {
-		/* Old TLLI to help BSS map from old->new */
-#if 0
-		if (mmctx->tlli_old)
-			msgb_tvlv_push(msg, BSSGP_IE_TLLI, 4, htonl(*tlli_old));
-#endif
-
-		/* IMSI */
-		if (strlen(mmctx->imsi)) {
-			uint8_t mi[10];
-			int imsi_len = gsm48_generate_mid_from_imsi(mi, mmctx->imsi);
-			if (imsi_len > 2)
-				msgb_tvlv_push(msg, BSSGP_IE_IMSI,
-							imsi_len-2, mi+2);
-		}
-
-		/* DRX parameters */
-		drx_params = htons(mmctx->drx_parms);
-		msgb_tvlv_push(msg, BSSGP_IE_DRX_PARAMS, 2,
-				(uint8_t *) &drx_params);
-
-		/* FIXME: Priority */
-
-		/* MS Radio Access Capability */
-		if (mmctx->ms_radio_access_capa.len)
-			msgb_tvlv_push(msg, BSSGP_IE_MS_RADIO_ACCESS_CAP,
-					mmctx->ms_radio_access_capa.len,
-					mmctx->ms_radio_access_capa.buf);
-	}
-
-	/* prepend the pdu lifetime */
-	pdu_lifetime = htons(pdu_lifetime);
-	msgb_tvlv_push(msg, BSSGP_IE_PDU_LIFETIME, 2, (uint8_t *)&pdu_lifetime);
-
-	/* prepend the QoS profile, TLLI and pdu type */
-	budh = (struct bssgp_ud_hdr *) msgb_push(msg, sizeof(*budh));
-	memcpy(budh->qos_profile, qos_profile_default, sizeof(qos_profile_default));
-	budh->tlli = htonl(msgb_tlli(msg));
-	budh->pdu_type = BSSGP_PDUT_DL_UNITDATA;
-
-	rate_ctr_inc(&bctx->ctrg->ctr[BSSGP_CTR_PKTS_OUT]);
-	rate_ctr_add(&bctx->ctrg->ctr[BSSGP_CTR_BYTES_OUT], msg->len);
-
-	/* Identifiers down: BVCI, NSEI (in msgb->cb) */
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
-
-/* Send a single GMM-PAGING.req to a given NSEI/NS-BVCI */
-int gprs_bssgp_tx_paging(uint16_t nsei, uint16_t ns_bvci,
-			 struct bssgp_paging_info *pinfo)
-{
-	struct msgb *msg = bssgp_msgb_alloc();
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));
-	uint16_t drx_params = htons(pinfo->drx_params);
-	uint8_t mi[10];
-	int imsi_len = gsm48_generate_mid_from_imsi(mi, pinfo->imsi);
-	uint8_t ra[6];
-
-	if (imsi_len < 2)
-		return -EINVAL;
-
-	msgb_nsei(msg) = nsei;
-	msgb_bvci(msg) = ns_bvci;
-
-	if (pinfo->mode == BSSGP_PAGING_PS)
-		bgph->pdu_type = BSSGP_PDUT_PAGING_PS;
-	else
-		bgph->pdu_type = BSSGP_PDUT_PAGING_CS;
-	/* IMSI */
-	msgb_tvlv_put(msg, BSSGP_IE_IMSI, imsi_len-2, mi+2);
-	/* DRX Parameters */
-	msgb_tvlv_put(msg, BSSGP_IE_DRX_PARAMS, 2,
-			(uint8_t *) &drx_params);
-	/* Scope */
-	switch (pinfo->scope) {
-	case BSSGP_PAGING_BSS_AREA:
-		{
-			uint8_t null = 0;
-			msgb_tvlv_put(msg, BSSGP_IE_BSS_AREA_ID, 1, &null);
-		}
-		break;
-	case BSSGP_PAGING_LOCATION_AREA:
-		gsm48_construct_ra(ra, &pinfo->raid);
-		msgb_tvlv_put(msg, BSSGP_IE_LOCATION_AREA, 4, ra);
-		break;
-	case BSSGP_PAGING_ROUTEING_AREA:
-		gsm48_construct_ra(ra, &pinfo->raid);
-		msgb_tvlv_put(msg, BSSGP_IE_ROUTEING_AREA, 6, ra);
-		break;
-	case BSSGP_PAGING_BVCI:
-		{
-			uint16_t bvci = htons(pinfo->bvci);
-			msgb_tvlv_put(msg, BSSGP_IE_BVCI, 2, (uint8_t *)&bvci);
-		}
-		break;
-	}
-	/* QoS profile mandatory for PS */
-	if (pinfo->mode == BSSGP_PAGING_PS)
-		msgb_tvlv_put(msg, BSSGP_IE_QOS_PROFILE, 3, pinfo->qos);
-
-	/* Optional (P-)TMSI */
-	if (pinfo->ptmsi) {
-		uint32_t ptmsi = htonl(*pinfo->ptmsi);
-		msgb_tvlv_put(msg, BSSGP_IE_TMSI, 4, (uint8_t *) &ptmsi);
-	}
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
diff --git a/openbsc/src/gprs/gprs_bssgp_util.c b/openbsc/src/gprs/gprs_bssgp_util.c
deleted file mode 100644
index f8e3b56..0000000
--- a/openbsc/src/gprs/gprs_bssgp_util.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/* GPRS BSSGP protocol implementation as per 3GPP TS 08.18 */
-
-/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <errno.h>
-#include <stdint.h>
-
-#include <netinet/in.h>
-
-#include <osmocore/msgb.h>
-#include <osmocore/tlv.h>
-#include <osmocore/talloc.h>
-
-#include <openbsc/debug.h>
-#include <openbsc/gsm_data.h>
-#include <openbsc/gprs_bssgp.h>
-#include <openbsc/gprs_ns.h>
-
-struct gprs_ns_inst *bssgp_nsi;
-
-/* BSSGP Protocol specific, not implementation specific */
-/* FIXME: This needs to go into libosmocore after finished */
-
-/* Chapter 11.3.9 / Table 11.10: Cause coding */
-static const struct value_string bssgp_cause_strings[] = {
-	{ BSSGP_CAUSE_PROC_OVERLOAD,	"Processor overload" },
-	{ BSSGP_CAUSE_EQUIP_FAIL,	"Equipment Failure" },
-	{ BSSGP_CAUSE_TRASIT_NET_FAIL,	"Transit netowkr service failure" },
-	{ BSSGP_CAUSE_CAPA_GREATER_0KPBS,"Transmission capacity modified" },
-	{ BSSGP_CAUSE_UNKNOWN_MS,	"Unknown MS" },
-	{ BSSGP_CAUSE_UNKNOWN_BVCI,	"Unknown BVCI" },
-	{ BSSGP_CAUSE_CELL_TRAF_CONG,	"Cell traffic congestion" },
-	{ BSSGP_CAUSE_SGSN_CONG,	"SGSN congestion" },
-	{ BSSGP_CAUSE_OML_INTERV,	"O&M intervention" },
-	{ BSSGP_CAUSE_BVCI_BLOCKED,	"BVCI blocked" },
-	{ BSSGP_CAUSE_PFC_CREATE_FAIL,	"PFC create failure" },
-	{ BSSGP_CAUSE_SEM_INCORR_PDU,	"Semantically incorrect PDU" },
-	{ BSSGP_CAUSE_INV_MAND_INF,	"Invalid mandatory information" },
-	{ BSSGP_CAUSE_MISSING_MAND_IE,	"Missing mandatory IE" },
-	{ BSSGP_CAUSE_MISSING_COND_IE,	"Missing conditional IE" },
-	{ BSSGP_CAUSE_UNEXP_COND_IE,	"Unexpected conditional IE" },
-	{ BSSGP_CAUSE_COND_IE_ERR,	"Conditional IE error" },
-	{ BSSGP_CAUSE_PDU_INCOMP_STATE,	"PDU incompatible with protocol state" },
-	{ BSSGP_CAUSE_PROTO_ERR_UNSPEC,	"Protocol error - unspecified" },
-	{ BSSGP_CAUSE_PDU_INCOMP_FEAT, 	"PDU not compatible with feature set" },
-	{ 0, NULL },
-};
-
-const char *bssgp_cause_str(enum gprs_bssgp_cause cause)
-{
-	return get_value_string(bssgp_cause_strings, cause);
-}
-
-
-struct msgb *bssgp_msgb_alloc(void)
-{
-	return msgb_alloc_headroom(4096, 128, "BSSGP");
-}
-
-/* Transmit a simple response such as BLOCK/UNBLOCK/RESET ACK/NACK */
-int bssgp_tx_simple_bvci(uint8_t pdu_type, uint16_t nsei,
-			 uint16_t bvci, uint16_t ns_bvci)
-{
-	struct msgb *msg = bssgp_msgb_alloc();
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));
-	uint16_t _bvci;
-
-	msgb_nsei(msg) = nsei;
-	msgb_bvci(msg) = ns_bvci;
-
-	bgph->pdu_type = pdu_type;
-	_bvci = htons(bvci);
-	msgb_tvlv_put(msg, BSSGP_IE_BVCI, 2, (uint8_t *) &_bvci);
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
-
-/* Chapter 10.4.14: Status */
-int bssgp_tx_status(uint8_t cause, uint16_t *bvci, struct msgb *orig_msg)
-{
-	struct msgb *msg = bssgp_msgb_alloc();
-	struct bssgp_normal_hdr *bgph =
-			(struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));
-
-	LOGP(DBSSGP, LOGL_NOTICE, "BSSGP BVCI=%u Tx STATUS, cause=%s\n",
-		bvci ? *bvci : 0, bssgp_cause_str(cause));
-	msgb_nsei(msg) = msgb_nsei(orig_msg);
-	msgb_bvci(msg) = 0;
-
-	bgph->pdu_type = BSSGP_PDUT_STATUS;
-	msgb_tvlv_put(msg, BSSGP_IE_CAUSE, 1, &cause);
-	if (bvci) {
-		uint16_t _bvci = htons(*bvci);
-		msgb_tvlv_put(msg, BSSGP_IE_BVCI, 2, (uint8_t *) &_bvci);
-	}
-	if (orig_msg)
-		msgb_tvlv_put(msg, BSSGP_IE_PDU_IN_ERROR,
-			      msgb_bssgp_len(orig_msg), msgb_bssgph(orig_msg));
-
-	return gprs_ns_sendmsg(bssgp_nsi, msg);
-}
diff --git a/openbsc/src/gprs/gprs_bssgp_vty.c b/openbsc/src/gprs/gprs_bssgp_vty.c
deleted file mode 100644
index 9ebd090..0000000
--- a/openbsc/src/gprs/gprs_bssgp_vty.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/* VTY interface for our GPRS BSS Gateway Protocol (BSSGP) implementation */
-
-/* (C) 2010 by Harald Welte <laforge@gnumonks.org>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdint.h>
-
-#include <arpa/inet.h>
-
-#include <openbsc/gsm_data.h>
-#include <osmocore/msgb.h>
-#include <osmocore/tlv.h>
-#include <osmocore/talloc.h>
-#include <osmocore/select.h>
-#include <osmocore/rate_ctr.h>
-#include <openbsc/debug.h>
-#include <openbsc/signal.h>
-#include <openbsc/gprs_ns.h>
-#include <openbsc/gprs_bssgp.h>
-#include <openbsc/vty.h>
-
-#include <osmocom/vty/vty.h>
-#include <osmocom/vty/command.h>
-#include <osmocom/vty/logging.h>
-#include <osmocom/vty/telnet_interface.h>
-
-/* FIXME: this should go to some common file as it is copied
- * in vty_interface.c of the BSC */
-static const struct value_string gprs_bssgp_timer_strs[] = {
-	{ 0, NULL }
-};
-
-static struct cmd_node bssgp_node = {
-	BSSGP_NODE,
-	"%s(bssgp)#",
-	1,
-};
-
-static int config_write_bssgp(struct vty *vty)
-{
-	vty_out(vty, "bssgp%s", VTY_NEWLINE);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_bssgp, cfg_bssgp_cmd,
-      "bssgp",
-      "Configure the GPRS BSS Gateway Protocol")
-{
-	vty->node = BSSGP_NODE;
-	return CMD_SUCCESS;
-}
-
-static void dump_bvc(struct vty *vty, struct bssgp_bvc_ctx *bvc, int stats)
-{
-	vty_out(vty, "NSEI %5u, BVCI %5u, RA-ID: %u-%u-%u-%u, CID: %u, "
-		"STATE: %s%s", bvc->nsei, bvc->bvci, bvc->ra_id.mcc,
-		bvc->ra_id.mnc, bvc->ra_id.lac, bvc->ra_id.rac, bvc->cell_id,
-		bvc->state & BVC_S_BLOCKED ? "BLOCKED" : "UNBLOCKED",
-		VTY_NEWLINE);
-	if (stats)
-		vty_out_rate_ctr_group(vty, " ", bvc->ctrg);
-}
-
-static void dump_bssgp(struct vty *vty, int stats)
-{
-	struct bssgp_bvc_ctx *bvc;
-
-	llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
-		dump_bvc(vty, bvc, stats);
-	}
-}
-
-#define BSSGP_STR "Show information about the BSSGP protocol\n"
-
-DEFUN(show_bssgp, show_bssgp_cmd, "show bssgp",
-	SHOW_STR BSSGP_STR)
-{
-	dump_bssgp(vty, 0);
-	return CMD_SUCCESS;
-}
-
-DEFUN(show_bssgp_stats, show_bssgp_stats_cmd, "show bssgp stats",
-	SHOW_STR BSSGP_STR
-	"Include statistics\n")
-{
-	dump_bssgp(vty, 1);
-	return CMD_SUCCESS;
-}
-
-DEFUN(show_bvc, show_bvc_cmd, "show bssgp nsei <0-65535> [stats]",
-	SHOW_STR BSSGP_STR
-	"Show all BVCs on one NSE\n"
-	"The NSEI\n" "Include Statistics\n")
-{
-	struct bssgp_bvc_ctx *bvc;
-	uint16_t nsei = atoi(argv[1]);
-	int show_stats = 0;
-
-	if (argc >= 2)
-		show_stats = 1;
-
-	llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
-		if (bvc->nsei != nsei)
-			continue;
-		dump_bvc(vty, bvc, show_stats);
-	}
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(logging_fltr_bvc,
-      logging_fltr_bvc_cmd,
-      "logging filter bvc nsei <0-65535> bvci <0-65535>",
-	LOGGING_STR FILTER_STR
-	"Filter based on BSSGP Virtual Connection\n"
-	"NSEI of the BVC to be filtered\n"
-	"Network Service Entity Identifier (NSEI)\n"
-	"BVCI of the BVC to be filtered\n"
-	"BSSGP Virtual Connection Identifier (BVCI)\n")
-{
-	struct log_target *tgt = osmo_log_vty2tgt(vty);
-	struct bssgp_bvc_ctx *bvc;
-	uint16_t nsei = atoi(argv[0]);
-	uint16_t bvci = atoi(argv[1]);
-
-	if (!tgt)
-		return CMD_WARNING;
-
-	bvc = btsctx_by_bvci_nsei(bvci, nsei);
-	if (!bvc) {
-		vty_out(vty, "No BVC by that identifier%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	log_set_bvc_filter(tgt, bvc);
-	return CMD_SUCCESS;
-}
-
-int gprs_bssgp_vty_init(void)
-{
-	install_element_ve(&show_bssgp_cmd);
-	install_element_ve(&show_bssgp_stats_cmd);
-	install_element_ve(&show_bvc_cmd);
-	install_element_ve(&logging_fltr_bvc_cmd);
-
-	install_element(CFG_LOG_NODE, &logging_fltr_bvc_cmd);
-
-	install_element(CONFIG_NODE, &cfg_bssgp_cmd);
-	install_node(&bssgp_node, config_write_bssgp);
-	install_default(BSSGP_NODE);
-	install_element(BSSGP_NODE, &ournode_exit_cmd);
-	install_element(BSSGP_NODE, &ournode_end_cmd);
-	//install_element(BSSGP_NODE, &cfg_bssgp_timer_cmd);
-
-	return 0;
-}
diff --git a/openbsc/src/gprs/gprs_ns.c b/openbsc/src/gprs/gprs_ns.c
deleted file mode 100644
index 5a8e358..0000000
--- a/openbsc/src/gprs/gprs_ns.c
+++ /dev/null
@@ -1,992 +0,0 @@
-/* GPRS Networks Service (NS) messages on the Gb interfacebvci = msgb_bvci(msg);
- * 3GPP TS 08.16 version 8.0.1 Release 1999 / ETSI TS 101 299 V8.0.1 (2002-05) */
-
-/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/* Some introduction into NS:  NS is used typically on top of frame relay,
- * but in the ip.access world it is encapsulated in UDP packets.  It serves
- * as an intermediate shim betwen BSSGP and the underlying medium.  It doesn't
- * do much, apart from providing congestion notification and status indication.
- *
- * Terms:
- * 	NS		Network Service
- *	NSVC		NS Virtual Connection
- *	NSEI		NS Entity Identifier
- *	NSVL		NS Virtual Link
- *	NSVLI		NS Virtual Link Identifier
- *	BVC		BSSGP Virtual Connection
- *	BVCI		BSSGP Virtual Connection Identifier
- *	NSVCG		NS Virtual Connection Goup
- *	Blocked		NS-VC cannot be used for user traffic
- *	Alive		Ability of a NS-VC to provide communication
- *
- *  There can be multiple BSSGP virtual connections over one (group of) NSVC's.  BSSGP will
- * therefore identify the BSSGP virtual connection by a BVCI passed down to NS.
- * NS then has to firgure out which NSVC's are responsible for this BVCI.
- * Those mappings are administratively configured.
- */
-
-/* This implementation has the following limitations:
- *  o Only one NS-VC for each NSE: No load-sharing function
- *  o NSVCI 65535 and 65534 are reserved for internal use
- *  o Only UDP is supported as of now, no frame relay support
- *  o The IP Sub-Network-Service (SNS) as specified in 48.016 is not implemented
- *  o There are no BLOCK and UNBLOCK timers (yet?)
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdint.h>
-
-#include <arpa/inet.h>
-
-#include <openbsc/gsm_data.h>
-#include <osmocore/msgb.h>
-#include <osmocore/tlv.h>
-#include <osmocore/talloc.h>
-#include <osmocore/select.h>
-#include <osmocore/rate_ctr.h>
-#include <openbsc/debug.h>
-#include <openbsc/signal.h>
-#include <openbsc/gprs_ns.h>
-#include <openbsc/gprs_bssgp.h>
-#include <openbsc/gprs_ns_frgre.h>
-#include <openbsc/socket.h>
-
-static const struct tlv_definition ns_att_tlvdef = {
-	.def = {
-		[NS_IE_CAUSE]	= { TLV_TYPE_TvLV, 0 },
-		[NS_IE_VCI]	= { TLV_TYPE_TvLV, 0 },
-		[NS_IE_PDU]	= { TLV_TYPE_TvLV, 0 },
-		[NS_IE_BVCI]	= { TLV_TYPE_TvLV, 0 },
-		[NS_IE_NSEI]	= { TLV_TYPE_TvLV, 0 },
-	},
-};
-
-enum ns_ctr {
-	NS_CTR_PKTS_IN,
-	NS_CTR_PKTS_OUT,
-	NS_CTR_BYTES_IN,
-	NS_CTR_BYTES_OUT,
-	NS_CTR_BLOCKED,
-	NS_CTR_DEAD,
-};
-
-static const struct rate_ctr_desc nsvc_ctr_description[] = {
-	{ "packets.in", "Packets at NS Level ( In)" },
-	{ "packets.out","Packets at NS Level (Out)" },
-	{ "bytes.in",	"Bytes at NS Level   ( In)" },
-	{ "bytes.out",	"Bytes at NS Level   (Out)" },
-	{ "blocked",	"NS-VC Block count        " },
-	{ "dead",	"NS-VC gone dead count    " },
-};
-
-static const struct rate_ctr_group_desc nsvc_ctrg_desc = {
-	.group_name_prefix = "ns.nsvc",
-	.group_description = "NSVC Peer Statistics",
-	.num_ctr = ARRAY_SIZE(nsvc_ctr_description),
-	.ctr_desc = nsvc_ctr_description,
-};
-
-/* Lookup struct gprs_nsvc based on NSVCI */
-struct gprs_nsvc *nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci)
-{
-	struct gprs_nsvc *nsvc;
-	llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
-		if (nsvc->nsvci == nsvci)
-			return nsvc;
-	}
-	return NULL;
-}
-
-/* Lookup struct gprs_nsvc based on NSVCI */
-struct gprs_nsvc *nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei)
-{
-	struct gprs_nsvc *nsvc;
-	llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
-		if (nsvc->nsei == nsei)
-			return nsvc;
-	}
-	return NULL;
-}
-
-/* Lookup struct gprs_nsvc based on remote peer socket addr */
-static struct gprs_nsvc *nsvc_by_rem_addr(struct gprs_ns_inst *nsi,
-					  struct sockaddr_in *sin)
-{
-	struct gprs_nsvc *nsvc;
-	llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
-		if (nsvc->ip.bts_addr.sin_addr.s_addr ==
-					sin->sin_addr.s_addr &&
-		    nsvc->ip.bts_addr.sin_port == sin->sin_port)
-			return nsvc;
-	}
-	return NULL;
-}
-
-static void gprs_ns_timer_cb(void *data);
-
-struct gprs_nsvc *nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci)
-{
-	struct gprs_nsvc *nsvc;
-
-	LOGP(DNS, LOGL_INFO, "NSVCI=%u Creating NS-VC\n", nsvci);
-
-	nsvc = talloc_zero(nsi, struct gprs_nsvc);
-	nsvc->nsvci = nsvci;
-	/* before RESET procedure: BLOCKED and DEAD */
-	nsvc->state = NSE_S_BLOCKED;
-	nsvc->nsi = nsi;
-	nsvc->timer.cb = gprs_ns_timer_cb;
-	nsvc->timer.data = nsvc;
-	nsvc->ctrg = rate_ctr_group_alloc(nsvc, &nsvc_ctrg_desc, nsvci);
-
-	llist_add(&nsvc->list, &nsi->gprs_nsvcs);
-
-	return nsvc;
-}
-
-void nsvc_delete(struct gprs_nsvc *nsvc)
-{
-	if (bsc_timer_pending(&nsvc->timer))
-		bsc_del_timer(&nsvc->timer);
-	llist_del(&nsvc->list);
-	talloc_free(nsvc);
-}
-
-static void ns_dispatch_signal(struct gprs_nsvc *nsvc, unsigned int signal,
-			       uint8_t cause)
-{
-	struct ns_signal_data nssd;
-
-	nssd.nsvc = nsvc;
-	nssd.cause = cause;
-
-	dispatch_signal(SS_NS, signal, &nssd);
-}
-
-/* Section 10.3.2, Table 13 */
-static const struct value_string ns_cause_str[] = {
-	{ NS_CAUSE_TRANSIT_FAIL,	"Transit network failure" },
-	{ NS_CAUSE_OM_INTERVENTION, 	"O&M intervention" },
-	{ NS_CAUSE_EQUIP_FAIL,		"Equipment failure" },
-	{ NS_CAUSE_NSVC_BLOCKED,	"NS-VC blocked" },
-	{ NS_CAUSE_NSVC_UNKNOWN,	"NS-VC unknown" },
-	{ NS_CAUSE_BVCI_UNKNOWN,	"BVCI unknown" },
-	{ NS_CAUSE_SEM_INCORR_PDU,	"Semantically incorrect PDU" },
-	{ NS_CAUSE_PDU_INCOMP_PSTATE,	"PDU not compatible with protocol state" },
-	{ NS_CAUSE_PROTO_ERR_UNSPEC,	"Protocol error, unspecified" },
-	{ NS_CAUSE_INVAL_ESSENT_IE,	"Invalid essential IE" },
-	{ NS_CAUSE_MISSING_ESSENT_IE,	"Missing essential IE" },
-	{ 0, NULL }
-};
-
-const char *gprs_ns_cause_str(enum ns_cause cause)
-{
-	return get_value_string(ns_cause_str, cause);
-}
-
-static int nsip_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg);
-extern int grps_ns_frgre_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg);
-
-static int gprs_ns_tx(struct gprs_nsvc *nsvc, struct msgb *msg)
-{
-	int ret;
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-
-	/* Increment number of Uplink bytes */
-	rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_PKTS_OUT]);
-	rate_ctr_add(&nsvc->ctrg->ctr[NS_CTR_BYTES_OUT], msgb_l2len(msg));
-
-	switch (nsvc->ll) {
-	case GPRS_NS_LL_UDP:
-		ret = nsip_sendmsg(nsvc, msg);
-		break;
-	case GPRS_NS_LL_FR_GRE:
-		ret = gprs_ns_frgre_sendmsg(nsvc, msg);
-		break;
-	default:
-		LOGP(DNS, LOGL_ERROR, "unsupported NS linklayer %u\n", nsvc->ll);
-		msgb_free(msg);
-		ret = -EIO;
-		break;
-	}
-	return ret;
-}
-
-static int gprs_ns_tx_simple(struct gprs_nsvc *nsvc, uint8_t pdu_type)
-{
-	struct msgb *msg = gprs_ns_msgb_alloc();
-	struct gprs_ns_hdr *nsh;
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-
-	if (!msg)
-		return -ENOMEM;
-
-	msg->l2h = msgb_put(msg, sizeof(*nsh));
-	nsh = (struct gprs_ns_hdr *) msg->l2h;
-
-	nsh->pdu_type = pdu_type;
-
-	return gprs_ns_tx(nsvc, msg);
-}
-
-int gprs_ns_tx_reset(struct gprs_nsvc *nsvc, uint8_t cause)
-{
-	struct msgb *msg = gprs_ns_msgb_alloc();
-	struct gprs_ns_hdr *nsh;
-	uint16_t nsvci = htons(nsvc->nsvci);
-	uint16_t nsei = htons(nsvc->nsei);
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-
-	if (!msg)
-		return -ENOMEM;
-
-	LOGP(DNS, LOGL_INFO, "NSEI=%u Tx NS RESET (NSVCI=%u, cause=%s)\n",
-		nsvc->nsei, nsvc->nsvci, gprs_ns_cause_str(cause));
-
-	msg->l2h = msgb_put(msg, sizeof(*nsh));
-	nsh = (struct gprs_ns_hdr *) msg->l2h;
-	nsh->pdu_type = NS_PDUT_RESET;
-
-	msgb_tvlv_put(msg, NS_IE_CAUSE, 1, &cause);
-	msgb_tvlv_put(msg, NS_IE_VCI, 2, (uint8_t *) &nsvci);
-	msgb_tvlv_put(msg, NS_IE_NSEI, 2, (uint8_t *) &nsei);
-
-	return gprs_ns_tx(nsvc, msg);
-
-}
-
-int gprs_ns_tx_status(struct gprs_nsvc *nsvc, uint8_t cause,
-		      uint16_t bvci, struct msgb *orig_msg)
-{
-	struct msgb *msg = gprs_ns_msgb_alloc();
-	struct gprs_ns_hdr *nsh;
-	uint16_t nsvci = htons(nsvc->nsvci);
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-
-	bvci = htons(bvci);
-
-	if (!msg)
-		return -ENOMEM;
-
-	LOGP(DNS, LOGL_NOTICE, "NSEI=%u Tx NS STATUS (NSVCI=%u, cause=%s)\n",
-		nsvc->nsei, nsvc->nsvci, gprs_ns_cause_str(cause));
-
-	msg->l2h = msgb_put(msg, sizeof(*nsh));
-	nsh = (struct gprs_ns_hdr *) msg->l2h;
-	nsh->pdu_type = NS_PDUT_STATUS;
-
-	msgb_tvlv_put(msg, NS_IE_CAUSE, 1, &cause);
-
-	/* Section 9.2.7.1: Static conditions for NS-VCI */
-	if (cause == NS_CAUSE_NSVC_BLOCKED ||
-	    cause == NS_CAUSE_NSVC_UNKNOWN)
-		msgb_tvlv_put(msg, NS_IE_VCI, 2, (uint8_t *)&nsvci);
-
-	/* Section 9.2.7.2: Static conditions for NS PDU */
-	switch (cause) {
-	case NS_CAUSE_SEM_INCORR_PDU:
-	case NS_CAUSE_PDU_INCOMP_PSTATE:
-	case NS_CAUSE_PROTO_ERR_UNSPEC:
-	case NS_CAUSE_INVAL_ESSENT_IE:
-	case NS_CAUSE_MISSING_ESSENT_IE:
-		msgb_tvlv_put(msg, NS_IE_PDU, msgb_l2len(orig_msg),
-			      orig_msg->l2h);
-		break;
-	default:
-		break;
-	}
-
-	/* Section 9.2.7.3: Static conditions for BVCI */
-	if (cause == NS_CAUSE_BVCI_UNKNOWN)
-		msgb_tvlv_put(msg, NS_IE_VCI, 2, (uint8_t *)&bvci);
-
-	return gprs_ns_tx(nsvc, msg);
-}
-
-int gprs_ns_tx_block(struct gprs_nsvc *nsvc, uint8_t cause)
-{
-	struct msgb *msg = gprs_ns_msgb_alloc();
-	struct gprs_ns_hdr *nsh;
-	uint16_t nsvci = htons(nsvc->nsvci);
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-
-	if (!msg)
-		return -ENOMEM;
-
-	LOGP(DNS, LOGL_INFO, "NSEI=%u Tx NS BLOCK (NSVCI=%u, cause=%s)\n",
-		nsvc->nsei, nsvc->nsvci, gprs_ns_cause_str(cause));
-
-	/* be conservative and mark it as blocked even now! */
-	nsvc->state |= NSE_S_BLOCKED;
-	rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_BLOCKED]);
-
-	msg->l2h = msgb_put(msg, sizeof(*nsh));
-	nsh = (struct gprs_ns_hdr *) msg->l2h;
-	nsh->pdu_type = NS_PDUT_BLOCK;
-
-	msgb_tvlv_put(msg, NS_IE_CAUSE, 1, &cause);
-	msgb_tvlv_put(msg, NS_IE_VCI, 2, (uint8_t *) &nsvci);
-
-	return gprs_ns_tx(nsvc, msg);
-}
-
-int gprs_ns_tx_unblock(struct gprs_nsvc *nsvc)
-{
-	log_set_context(BSC_CTX_NSVC, nsvc);
-	LOGP(DNS, LOGL_INFO, "NSEI=%u Tx NS UNBLOCK (NSVCI=%u)\n",
-		nsvc->nsei, nsvc->nsvci);
-
-	return gprs_ns_tx_simple(nsvc, NS_PDUT_UNBLOCK);
-}
-
-int gprs_ns_tx_alive(struct gprs_nsvc *nsvc)
-{
-	log_set_context(BSC_CTX_NSVC, nsvc);
-	LOGP(DNS, LOGL_DEBUG, "NSEI=%u Tx NS ALIVE (NSVCI=%u)\n",
-		nsvc->nsei, nsvc->nsvci);
-
-	return gprs_ns_tx_simple(nsvc, NS_PDUT_ALIVE);
-}
-
-int gprs_ns_tx_alive_ack(struct gprs_nsvc *nsvc)
-{
-	log_set_context(BSC_CTX_NSVC, nsvc);
-	LOGP(DNS, LOGL_DEBUG, "NSEI=%u Tx NS ALIVE_ACK (NSVCI=%u)\n",
-		nsvc->nsei, nsvc->nsvci);
-
-	return gprs_ns_tx_simple(nsvc, NS_PDUT_ALIVE_ACK);
-}
-
-static const enum ns_timeout timer_mode_tout[_NSVC_TIMER_NR] = {
-	[NSVC_TIMER_TNS_RESET]	= NS_TOUT_TNS_RESET,
-	[NSVC_TIMER_TNS_ALIVE]	= NS_TOUT_TNS_ALIVE,
-	[NSVC_TIMER_TNS_TEST]	= NS_TOUT_TNS_TEST,
-};
-
-static const struct value_string timer_mode_strs[] = {
-	{ NSVC_TIMER_TNS_RESET, "tns-reset" },
-	{ NSVC_TIMER_TNS_ALIVE, "tns-alive" },
-	{ NSVC_TIMER_TNS_TEST, "tns-test" },
-	{ 0, NULL }
-};
-
-static void nsvc_start_timer(struct gprs_nsvc *nsvc, enum nsvc_timer_mode mode)
-{
-	enum ns_timeout tout = timer_mode_tout[mode];
-	unsigned int seconds = nsvc->nsi->timeout[tout];
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-	DEBUGP(DNS, "NSEI=%u Starting timer in mode %s (%u seconds)\n",
-		nsvc->nsei, get_value_string(timer_mode_strs, mode),
-		seconds);
-		
-	if (bsc_timer_pending(&nsvc->timer))
-		bsc_del_timer(&nsvc->timer);
-
-	nsvc->timer_mode = mode;
-	bsc_schedule_timer(&nsvc->timer, seconds, 0);
-}
-
-static void gprs_ns_timer_cb(void *data)
-{
-	struct gprs_nsvc *nsvc = data;
-	enum ns_timeout tout = timer_mode_tout[nsvc->timer_mode];
-	unsigned int seconds = nsvc->nsi->timeout[tout];
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-	DEBUGP(DNS, "NSEI=%u Timer expired in mode %s (%u seconds)\n",
-		nsvc->nsei, get_value_string(timer_mode_strs, nsvc->timer_mode),
-		seconds);
-		
-	switch (nsvc->timer_mode) {
-	case NSVC_TIMER_TNS_ALIVE:
-		/* Tns-alive case: we expired without response ! */
-		nsvc->alive_retries++;
-		if (nsvc->alive_retries >
-			nsvc->nsi->timeout[NS_TOUT_TNS_ALIVE_RETRIES]) {
-			/* mark as dead and blocked */
-			nsvc->state = NSE_S_BLOCKED;
-			rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_BLOCKED]);
-			rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_DEAD]);
-			LOGP(DNS, LOGL_NOTICE,
-				"NSEI=%u Tns-alive expired more then "
-				"%u times, blocking NS-VC\n", nsvc->nsei,
-				nsvc->nsi->timeout[NS_TOUT_TNS_ALIVE_RETRIES]);
-			ns_dispatch_signal(nsvc, S_NS_ALIVE_EXP, 0);
-			ns_dispatch_signal(nsvc, S_NS_BLOCK, NS_CAUSE_NSVC_BLOCKED);
-			return;
-		}
-		/* Tns-test case: send NS-ALIVE PDU */
-		gprs_ns_tx_alive(nsvc);
-		/* start Tns-alive timer */
-		nsvc_start_timer(nsvc, NSVC_TIMER_TNS_ALIVE);
-		break;
-	case NSVC_TIMER_TNS_TEST:
-		/* Tns-test case: send NS-ALIVE PDU */
-		gprs_ns_tx_alive(nsvc);
-		/* start Tns-alive timer (transition into faster
-		 * alive retransmissions) */
-		nsvc->alive_retries = 0;
-		nsvc_start_timer(nsvc, NSVC_TIMER_TNS_ALIVE);
-		break;
-	case NSVC_TIMER_TNS_RESET:
-		/* Chapter 7.3: Re-send the RESET */
-		gprs_ns_tx_reset(nsvc, NS_CAUSE_OM_INTERVENTION);
-		/* Re-start Tns-reset timer */
-		nsvc_start_timer(nsvc, NSVC_TIMER_TNS_RESET);
-		break;
-	case _NSVC_TIMER_NR:
-		break;
-	}
-}
-
-/* Section 9.2.6 */
-static int gprs_ns_tx_reset_ack(struct gprs_nsvc *nsvc)
-{
-	struct msgb *msg = gprs_ns_msgb_alloc();
-	struct gprs_ns_hdr *nsh;
-	uint16_t nsvci, nsei;
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-	if (!msg)
-		return -ENOMEM;
-
-	nsvci = htons(nsvc->nsvci);
-	nsei = htons(nsvc->nsei);
-
-	msg->l2h = msgb_put(msg, sizeof(*nsh));
-	nsh = (struct gprs_ns_hdr *) msg->l2h;
-
-	nsh->pdu_type = NS_PDUT_RESET_ACK;
-
-	LOGP(DNS, LOGL_INFO, "NSEI=%u Tx NS RESET ACK (NSVCI=%u)\n",
-		nsvc->nsei, nsvc->nsvci);
-
-	msgb_tvlv_put(msg, NS_IE_VCI, 2, (uint8_t *)&nsvci);
-	msgb_tvlv_put(msg, NS_IE_NSEI, 2, (uint8_t *)&nsei);
-
-	return gprs_ns_tx(nsvc, msg);
-}
-
-/* Section 9.2.10: transmit side / NS-UNITDATA-REQUEST primitive */
-int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
-{
-	struct gprs_nsvc *nsvc;
-	struct gprs_ns_hdr *nsh;
-	uint16_t bvci = msgb_bvci(msg);
-
-	nsvc = 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));
-		msgb_free(msg);
-		return -EINVAL;
-	}
-	log_set_context(BSC_CTX_NSVC, nsvc);
-
-	if (!(nsvc->state & NSE_S_ALIVE)) {
-		LOGP(DNS, LOGL_ERROR, "NSEI=%u is not alive, cannot send\n",
-			nsvc->nsei);
-		msgb_free(msg);
-		return -EBUSY;
-	}
-	if (nsvc->state & NSE_S_BLOCKED) {
-		LOGP(DNS, LOGL_ERROR, "NSEI=%u is blocked, cannot send\n",
-			nsvc->nsei);
-		msgb_free(msg);
-		return -EBUSY;
-	}
-
-	msg->l2h = msgb_push(msg, sizeof(*nsh) + 3);
-	nsh = (struct gprs_ns_hdr *) msg->l2h;
-	if (!nsh) {
-		LOGP(DNS, LOGL_ERROR, "Not enough headroom for NS header\n");
-		msgb_free(msg);
-		return -EIO;
-	}
-
-	nsh->pdu_type = NS_PDUT_UNITDATA;
-	/* spare octet in data[0] */
-	nsh->data[1] = bvci >> 8;
-	nsh->data[2] = bvci & 0xff;
-
-	return gprs_ns_tx(nsvc, msg);
-}
-
-/* Section 9.2.10: receive side */
-static int gprs_ns_rx_unitdata(struct gprs_nsvc *nsvc, struct msgb *msg)
-{
-	struct gprs_ns_hdr *nsh = (struct gprs_ns_hdr *)msg->l2h;
-	uint16_t bvci;
-
-	if (nsvc->state & NSE_S_BLOCKED)
-		return gprs_ns_tx_status(nsvc, NS_CAUSE_NSVC_BLOCKED,
-					 0, msg);
-
-	/* spare octet in data[0] */
-	bvci = nsh->data[1] << 8 | nsh->data[2];
-	msgb_bssgph(msg) = &nsh->data[3];
-	msgb_bvci(msg) = bvci;
-
-	/* call upper layer (BSSGP) */
-	return nsvc->nsi->cb(GPRS_NS_EVT_UNIT_DATA, nsvc, msg, bvci);
-}
-
-/* Section 9.2.7 */
-static int gprs_ns_rx_status(struct gprs_nsvc *nsvc, struct msgb *msg)
-{
-	struct gprs_ns_hdr *nsh = (struct gprs_ns_hdr *) msg->l2h;
-	struct tlv_parsed tp;
-	uint8_t cause;
-	int rc;
-
-	LOGP(DNS, LOGL_NOTICE, "NSEI=%u Rx NS STATUS ", nsvc->nsei);
-
-	rc = tlv_parse(&tp, &ns_att_tlvdef, nsh->data,
-			msgb_l2len(msg) - sizeof(*nsh), 0, 0);
-	if (rc < 0) {
-		LOGPC(DNS, LOGL_NOTICE, "Error during TLV Parse\n");
-		LOGP(DNS, LOGL_ERROR, "NSEI=%u Rx NS STATUS: "
-			"Error during TLV Parse\n", nsvc->nsei);
-		return rc;
-	}
-
-	if (!TLVP_PRESENT(&tp, NS_IE_CAUSE)) {
-		LOGPC(DNS, LOGL_INFO, "missing cause IE\n");
-		return -EINVAL;
-	}
-
-	cause = *TLVP_VAL(&tp, NS_IE_CAUSE);
-	LOGPC(DNS, LOGL_NOTICE, "cause=%s\n", gprs_ns_cause_str(cause));
-
-	return 0;
-}
-
-/* Section 7.3 */
-static int gprs_ns_rx_reset(struct gprs_nsvc *nsvc, struct msgb *msg)
-{
-	struct gprs_ns_hdr *nsh = (struct gprs_ns_hdr *) msg->l2h;
-	struct tlv_parsed tp;
-	uint8_t *cause;
-	uint16_t *nsvci, *nsei;
-	int rc;
-
-	rc = tlv_parse(&tp, &ns_att_tlvdef, nsh->data,
-			msgb_l2len(msg) - sizeof(*nsh), 0, 0);
-	if (rc < 0) {
-		LOGP(DNS, LOGL_ERROR, "NSEI=%u Rx NS RESET "
-			"Error during TLV Parse\n", nsvc->nsei);
-		return rc;
-	}
-
-	if (!TLVP_PRESENT(&tp, NS_IE_CAUSE) ||
-	    !TLVP_PRESENT(&tp, NS_IE_VCI) ||
-	    !TLVP_PRESENT(&tp, NS_IE_NSEI)) {
-		LOGP(DNS, LOGL_ERROR, "NS RESET Missing mandatory IE\n");
-		gprs_ns_tx_status(nsvc, NS_CAUSE_MISSING_ESSENT_IE, 0, msg);
-		return -EINVAL;
-	}
-
-	cause = (uint8_t *) TLVP_VAL(&tp, NS_IE_CAUSE);
-	nsvci = (uint16_t *) TLVP_VAL(&tp, NS_IE_VCI);
-	nsei = (uint16_t *) TLVP_VAL(&tp, NS_IE_NSEI);
-
-	LOGP(DNS, LOGL_INFO, "NSEI=%u Rx NS RESET (NSVCI=%u, cause=%s)\n",
-		nsvc->nsvci, nsvc->nsei, gprs_ns_cause_str(*cause));
-
-	/* Mark NS-VC as blocked and alive */
-	nsvc->state = NSE_S_BLOCKED | NSE_S_ALIVE;
-
-	nsvc->nsei = ntohs(*nsei);
-	nsvc->nsvci = ntohs(*nsvci);
-
-	/* start the test procedure */
-	gprs_ns_tx_simple(nsvc, NS_PDUT_ALIVE);
-	nsvc_start_timer(nsvc, NSVC_TIMER_TNS_TEST);
-
-	/* inform interested parties about the fact that this NSVC
-	 * has received RESET */
-	ns_dispatch_signal(nsvc, S_NS_RESET, *cause);
-
-	return gprs_ns_tx_reset_ack(nsvc);
-}
-
-static int gprs_ns_rx_block(struct gprs_nsvc *nsvc, struct msgb *msg)
-{
-	struct gprs_ns_hdr *nsh = (struct gprs_ns_hdr *) msg->l2h;
-	struct tlv_parsed tp;
-	uint8_t *cause;
-	int rc;
-
-	LOGP(DNS, LOGL_INFO, "NSEI=%u Rx NS BLOCK\n", nsvc->nsei);
-
-	nsvc->state |= NSE_S_BLOCKED;
-
-	rc = tlv_parse(&tp, &ns_att_tlvdef, nsh->data,
-			msgb_l2len(msg) - sizeof(*nsh), 0, 0);
-	if (rc < 0) {
-		LOGP(DNS, LOGL_ERROR, "NSEI=%u Rx NS BLOCK "
-			"Error during TLV Parse\n", nsvc->nsei);
-		return rc;
-	}
-
-	if (!TLVP_PRESENT(&tp, NS_IE_CAUSE) ||
-	    !TLVP_PRESENT(&tp, NS_IE_VCI)) {
-		LOGP(DNS, LOGL_ERROR, "NS RESET Missing mandatory IE\n");
-		gprs_ns_tx_status(nsvc, NS_CAUSE_MISSING_ESSENT_IE, 0, msg);
-		return -EINVAL;
-	}
-
-	cause = (uint8_t *) TLVP_VAL(&tp, NS_IE_CAUSE);
-	//nsvci = (uint16_t *) TLVP_VAL(&tp, NS_IE_VCI);
-
-	ns_dispatch_signal(nsvc, S_NS_BLOCK, *cause);
-	rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_BLOCKED]);
-
-	return gprs_ns_tx_simple(nsvc, NS_PDUT_BLOCK_ACK);
-}
-
-/* main entry point, here incoming NS frames enter */
-int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
-		   struct sockaddr_in *saddr, enum gprs_ns_ll ll)
-{
-	struct gprs_ns_hdr *nsh = (struct gprs_ns_hdr *) msg->l2h;
-	struct gprs_nsvc *nsvc;
-	int rc = 0;
-
-	/* look up the NSVC based on source address */
-	nsvc = nsvc_by_rem_addr(nsi, saddr);
-	if (!nsvc) {
-		struct tlv_parsed tp;
-		uint16_t nsei;
-		if (nsh->pdu_type == NS_PDUT_STATUS) {
-			LOGP(DNS, LOGL_INFO, "Ignoring NS STATUS from %s:%u "
-			     "for non-existing NS-VC\n",
-			     inet_ntoa(saddr->sin_addr), ntohs(saddr->sin_port));
-			return 0;
-		}
-		/* Only the RESET procedure creates a new NSVC */
-		if (nsh->pdu_type != NS_PDUT_RESET) {
-			/* Since we have no NSVC, we have to use a fake */
-			nsvc = nsi->unknown_nsvc;
-			log_set_context(BSC_CTX_NSVC, nsvc);
-			LOGP(DNS, LOGL_INFO, "Rejecting NS PDU type 0x%0x "
-				"from %s:%u for non-existing NS-VC\n",
-				nsh->pdu_type, inet_ntoa(saddr->sin_addr),
-				ntohs(saddr->sin_port));
-			nsvc->nsvci = nsvc->nsei = 0xfffe;
-			nsvc->ip.bts_addr = *saddr;
-			nsvc->state = NSE_S_ALIVE;
-			nsvc->ll = ll;
-#if 0
-			return gprs_ns_tx_reset(nsvc, NS_CAUSE_PDU_INCOMP_PSTATE);
-#else
-			return gprs_ns_tx_status(nsvc,
-						NS_CAUSE_PDU_INCOMP_PSTATE, 0,
-						msg);
-#endif
-		}
-		rc = tlv_parse(&tp, &ns_att_tlvdef, nsh->data,
-				msgb_l2len(msg) - sizeof(*nsh), 0, 0);
-		if (rc < 0) {
-			LOGP(DNS, LOGL_ERROR, "Rx NS RESET Error %d during "
-				"TLV Parse\n", rc);
-			return rc;
-		}
-		if (!TLVP_PRESENT(&tp, NS_IE_CAUSE) ||
-		    !TLVP_PRESENT(&tp, NS_IE_VCI) ||
-		    !TLVP_PRESENT(&tp, NS_IE_NSEI)) {
-			LOGP(DNS, LOGL_ERROR, "NS RESET Missing mandatory IE\n");
-			gprs_ns_tx_status(nsvc, NS_CAUSE_MISSING_ESSENT_IE, 0,
-					  msg);
-			return -EINVAL;
-		}
-		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);
-		if (!nsvc) {
-			nsvc = nsvc_create(nsi, 0xffff);
-			nsvc->ll = ll;
-			log_set_context(BSC_CTX_NSVC, nsvc);
-			LOGP(DNS, LOGL_INFO, "Creating NS-VC for BSS at %s:%u\n",
-				inet_ntoa(saddr->sin_addr), ntohs(saddr->sin_port));
-		}
-		/* Update the remote peer IP address/port */
-		nsvc->ip.bts_addr = *saddr;
-	} else
-		msgb_nsei(msg) = nsvc->nsei;
-
-	log_set_context(BSC_CTX_NSVC, nsvc);
-
-	/* Increment number of Incoming bytes */
-	rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_PKTS_IN]);
-	rate_ctr_add(&nsvc->ctrg->ctr[NS_CTR_BYTES_IN], msgb_l2len(msg));
-
-	switch (nsh->pdu_type) {
-	case NS_PDUT_ALIVE:
-		/* If we're dead and blocked and suddenly receive a
-		 * NS-ALIVE out of the blue, we might have been re-started
-		 * and should send a NS-RESET to make sure everything recovers
-		 * fine. */
-		if (nsvc->state == NSE_S_BLOCKED)
-			rc = gprs_ns_tx_reset(nsvc, NS_CAUSE_PDU_INCOMP_PSTATE);
-		else
-			rc = gprs_ns_tx_alive_ack(nsvc);
-		break;
-	case NS_PDUT_ALIVE_ACK:
-		/* stop Tns-alive and start Tns-test */
-		nsvc_start_timer(nsvc, NSVC_TIMER_TNS_TEST);
-		if (nsvc->remote_end_is_sgsn) {
-			/* FIXME: this should be one level higher */
-			if (nsvc->state & NSE_S_BLOCKED)
-				rc = gprs_ns_tx_unblock(nsvc);
-		}
-		break;
-	case NS_PDUT_UNITDATA:
-		/* actual user data */
-		rc = gprs_ns_rx_unitdata(nsvc, msg);
-		break;
-	case NS_PDUT_STATUS:
-		rc = gprs_ns_rx_status(nsvc, msg);
-		break;
-	case NS_PDUT_RESET:
-		rc = gprs_ns_rx_reset(nsvc, msg);
-		break;
-	case NS_PDUT_RESET_ACK:
-		LOGP(DNS, LOGL_INFO, "NSEI=%u Rx NS RESET ACK\n", nsvc->nsei);
-		/* mark NS-VC as blocked + active */
-		nsvc->state = NSE_S_BLOCKED | NSE_S_ALIVE;
-		nsvc->remote_state = NSE_S_BLOCKED | NSE_S_ALIVE;
-		rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_BLOCKED]);
-		if (nsvc->persistent || nsvc->remote_end_is_sgsn) {
-			/* stop RESET timer */
-			bsc_del_timer(&nsvc->timer);
-		}
-		/* Initiate TEST proc.: Send ALIVE and start timer */
-		rc = gprs_ns_tx_simple(nsvc, NS_PDUT_ALIVE);
-		nsvc_start_timer(nsvc, NSVC_TIMER_TNS_TEST);
-		break;
-	case NS_PDUT_UNBLOCK:
-		/* Section 7.2: unblocking procedure */
-		LOGP(DNS, LOGL_INFO, "NSEI=%u Rx NS UNBLOCK\n", nsvc->nsei);
-		nsvc->state &= ~NSE_S_BLOCKED;
-		ns_dispatch_signal(nsvc, S_NS_UNBLOCK, 0);
-		rc = gprs_ns_tx_simple(nsvc, NS_PDUT_UNBLOCK_ACK);
-		break;
-	case NS_PDUT_UNBLOCK_ACK:
-		LOGP(DNS, LOGL_INFO, "NSEI=%u Rx NS UNBLOCK ACK\n", nsvc->nsei);
-		/* mark NS-VC as unblocked + active */
-		nsvc->state = NSE_S_ALIVE;
-		nsvc->remote_state = NSE_S_ALIVE;
-		ns_dispatch_signal(nsvc, S_NS_UNBLOCK, 0);
-		break;
-	case NS_PDUT_BLOCK:
-		rc = gprs_ns_rx_block(nsvc, msg);
-		break;
-	case NS_PDUT_BLOCK_ACK:
-		LOGP(DNS, LOGL_INFO, "NSEI=%u Rx NS BLOCK ACK\n", nsvc->nsei);
-		/* mark remote NS-VC as blocked + active */
-		nsvc->remote_state = NSE_S_BLOCKED | NSE_S_ALIVE;
-		break;
-	default:
-		LOGP(DNS, LOGL_NOTICE, "NSEI=%u Rx Unknown NS PDU type 0x%02x\n",
-			nsvc->nsei, nsh->pdu_type);
-		rc = -EINVAL;
-		break;
-	}
-	return rc;
-}
-
-struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb)
-{
-	struct gprs_ns_inst *nsi = talloc_zero(tall_bsc_ctx, struct gprs_ns_inst);
-
-	nsi->cb = cb;
-	INIT_LLIST_HEAD(&nsi->gprs_nsvcs);
-	nsi->timeout[NS_TOUT_TNS_BLOCK] = 3;
-	nsi->timeout[NS_TOUT_TNS_BLOCK_RETRIES] = 3;
-	nsi->timeout[NS_TOUT_TNS_RESET] = 3;
-	nsi->timeout[NS_TOUT_TNS_RESET_RETRIES] = 3;
-	nsi->timeout[NS_TOUT_TNS_TEST] = 30;
-	nsi->timeout[NS_TOUT_TNS_ALIVE] = 3;
-	nsi->timeout[NS_TOUT_TNS_ALIVE_RETRIES] = 10;
-
-	/* Create the dummy NSVC that we use for sending
-	 * messages to non-existant/unknown NS-VC's */
-	nsi->unknown_nsvc = nsvc_create(nsi, 0xfffe);
-	llist_del(&nsi->unknown_nsvc->list);
-
-	return nsi;
-}
-
-void gprs_ns_destroy(struct gprs_ns_inst *nsi)
-{
-	/* FIXME: clear all timers */
-
-	/* recursively free the NSI and all its NSVCs */
-	talloc_free(nsi);
-}
-
-
-/* NS-over-IP code, according to 3GPP TS 48.016 Chapter 6.2
- * We don't support Size Procedure, Configuration Procedure, ChangeWeight Procedure */
-
-/* Read a single NS-over-IP message */
-static struct msgb *read_nsip_msg(struct bsc_fd *bfd, int *error,
-				  struct sockaddr_in *saddr)
-{
-	struct msgb *msg = gprs_ns_msgb_alloc();
-	int ret = 0;
-	socklen_t saddr_len = sizeof(*saddr);
-
-	if (!msg) {
-		*error = -ENOMEM;
-		return NULL;
-	}
-
-	ret = recvfrom(bfd->fd, msg->data, NS_ALLOC_SIZE - NS_ALLOC_HEADROOM, 0,
-			(struct sockaddr *)saddr, &saddr_len);
-	if (ret < 0) {
-		LOGP(DNS, LOGL_ERROR, "recv error %s during NSIP recv\n",
-			strerror(errno));
-		msgb_free(msg);
-		*error = ret;
-		return NULL;
-	} else if (ret == 0) {
-		msgb_free(msg);
-		*error = ret;
-		return NULL;
-	}
-
-	msg->l2h = msg->data;
-	msgb_put(msg, ret);
-
-	return msg;
-}
-
-static int handle_nsip_read(struct bsc_fd *bfd)
-{
-	int error;
-	struct sockaddr_in saddr;
-	struct gprs_ns_inst *nsi = bfd->data;
-	struct msgb *msg = read_nsip_msg(bfd, &error, &saddr);
-
-	if (!msg)
-		return error;
-
-	error = gprs_ns_rcvmsg(nsi, msg, &saddr, GPRS_NS_LL_UDP);
-
-	msgb_free(msg);
-
-	return error;
-}
-
-static int handle_nsip_write(struct bsc_fd *bfd)
-{
-	/* FIXME: actually send the data here instead of nsip_sendmsg() */
-	return -EIO;
-}
-
-static int nsip_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg)
-{
-	int rc;
-	struct gprs_ns_inst *nsi = nsvc->nsi;
-	struct sockaddr_in *daddr = &nsvc->ip.bts_addr;
-
-	rc = sendto(nsi->nsip.fd.fd, msg->data, msg->len, 0,
-		  (struct sockaddr *)daddr, sizeof(*daddr));
-
-	talloc_free(msg);
-
-	return rc;
-}
-
-/* UDP Port 23000 carries the LLC-in-BSSGP-in-NS protocol stack */
-static int nsip_fd_cb(struct bsc_fd *bfd, unsigned int what)
-{
-	int rc = 0;
-
-	if (what & BSC_FD_READ)
-		rc = handle_nsip_read(bfd);
-	if (what & BSC_FD_WRITE)
-		rc = handle_nsip_write(bfd);
-
-	return rc;
-}
-
-/* Listen for incoming GPRS packets */
-int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi)
-{
-	int ret;
-
-	ret = make_sock(&nsi->nsip.fd, IPPROTO_UDP, nsi->nsip.local_ip,
-			nsi->nsip.local_port, nsip_fd_cb);
-	if (ret < 0)
-		return ret;
-
-	nsi->nsip.fd.data = nsi;
-
-	return ret;
-}
-
-/* Initiate a RESET procedure */
-void gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause)
-{
-	LOGP(DNS, LOGL_INFO, "NSEI=%u RESET procedure based on API request\n",
-		nsvc->nsei);
-
-	/* Mark NS-VC locally as blocked and dead */
-	nsvc->state = NSE_S_BLOCKED;
-	/* Send NS-RESET PDU */
-	if (gprs_ns_tx_reset(nsvc, cause) < 0) {
-		LOGP(DNS, LOGL_ERROR, "NSEI=%u, error resetting NS-VC\n",
-			nsvc->nsei);
-	}
-	/* Start Tns-reset */
-	nsvc_start_timer(nsvc, NSVC_TIMER_TNS_RESET);
-}
-
-/* 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;
-
-	nsvc = nsvc_by_rem_addr(nsi, dest);
-	if (!nsvc)
-		nsvc = nsvc_create(nsi, nsvci);
-	nsvc->ip.bts_addr = *dest;
-	nsvc->nsei = nsei;
-	nsvc->nsvci = nsvci;
-	nsvc->remote_end_is_sgsn = 1;
-
-	gprs_nsvc_reset(nsvc, NS_CAUSE_OM_INTERVENTION);
-	return nsvc;
-}
diff --git a/openbsc/src/gprs/gprs_ns_frgre.c b/openbsc/src/gprs/gprs_ns_frgre.c
deleted file mode 100644
index 106f410..0000000
--- a/openbsc/src/gprs/gprs_ns_frgre.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* GPRS Networks Service (NS) messages on the Gb interface
- * 3GPP TS 08.16 version 8.0.1 Release 1999 / ETSI TS 101 299 V8.0.1 (2002-05) */
-
-/* NS-over-FR-over-GRE implementation */
-
-/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/ip.h>
-#include <arpa/inet.h>
-
-#include <osmocore/select.h>
-#include <osmocore/msgb.h>
-#include <osmocore/talloc.h>
-
-#include <openbsc/socket.h>
-#include <openbsc/debug.h>
-#include <openbsc/gprs_ns.h>
-
-#define GRE_PTYPE_FR	0x6559
-#define GRE_PTYPE_IPv4	0x0800
-#define GRE_PTYPE_KAR	0x0000	/* keepalive response */
-
-struct gre_hdr {
-	uint16_t flags;
-	uint16_t ptype;
-} __attribute__ ((packed));
-
-/* IPv4 messages inside the GRE tunnel might be GRE keepalives */
-static int handle_rx_gre_ipv4(struct bsc_fd *bfd, struct msgb *msg,
-				struct iphdr *iph, struct gre_hdr *greh)
-{
-	struct gprs_ns_inst *nsi = bfd->data;
-	int gre_payload_len;
-	struct iphdr *inner_iph;
-	struct gre_hdr *inner_greh;
-	struct sockaddr_in daddr;
-	struct in_addr ia;
-
-	gre_payload_len = msg->len - (iph->ihl*4 + sizeof(*greh));
-
-	inner_iph = (struct iphdr *) ((uint8_t *)greh + sizeof(*greh));
-
-	if (gre_payload_len < inner_iph->ihl*4 + sizeof(*inner_greh)) {
-		LOGP(DNS, LOGL_ERROR, "GRE keepalive too short\n");
-		return -EIO;
-	}
-
-	if (inner_iph->saddr != iph->daddr ||
-	    inner_iph->daddr != iph->saddr) {
-		LOGP(DNS, LOGL_ERROR,
-			"GRE keepalive with wrong tunnel addresses\n");
-		return -EIO;
-	}
-
-	if (inner_iph->protocol != IPPROTO_GRE) {
-		LOGP(DNS, LOGL_ERROR, "GRE keepalive with wrong protocol\n");
-		return -EIO;
-	}
-
-	inner_greh = (struct gre_hdr *) ((uint8_t *)inner_iph + iph->ihl*4);
-	if (inner_greh->ptype != htons(GRE_PTYPE_KAR)) {
-		LOGP(DNS, LOGL_ERROR, "GRE keepalive inner GRE type != 0\n");
-		return -EIO;
-	}
-
-	/* Actually send the response back */
-
-	daddr.sin_family = AF_INET;
-	daddr.sin_addr.s_addr = inner_iph->daddr;
-	daddr.sin_port = IPPROTO_GRE;
-
-	ia.s_addr = iph->saddr;
-	LOGP(DNS, LOGL_DEBUG, "GRE keepalive from %s, responding\n",
-		inet_ntoa(ia));
-
-	return sendto(nsi->frgre.fd.fd, inner_greh,
-		      gre_payload_len - inner_iph->ihl*4, 0,
-		      (struct sockaddr *)&daddr, sizeof(daddr));
-}
-
-static struct msgb *read_nsfrgre_msg(struct bsc_fd *bfd, int *error,
-					struct sockaddr_in *saddr)
-{
-	struct msgb *msg = msgb_alloc(NS_ALLOC_SIZE, "Gb/NS/FR/GRE Rx");
-	int ret = 0;
-	socklen_t saddr_len = sizeof(*saddr);
-	struct iphdr *iph;
-	struct gre_hdr *greh;
-	uint8_t *frh;
-	uint16_t dlci;
-
-	if (!msg) {
-		*error = -ENOMEM;
-		return NULL;
-	}
-
-	ret = recvfrom(bfd->fd, msg->data, NS_ALLOC_SIZE, 0,
-			(struct sockaddr *)saddr, &saddr_len);
-	if (ret < 0) {
-		LOGP(DNS, LOGL_ERROR, "recv error %s during NS-FR-GRE recv\n",
-			strerror(errno));
-		*error = ret;
-		goto out_err;
-	} else if (ret == 0) {
-		*error = ret;
-		goto out_err;
-	}
-
-	msgb_put(msg, ret);
-
-	if (msg->len < sizeof(*iph) + sizeof(*greh) + 2) {
-		LOGP(DNS, LOGL_ERROR, "Short IP packet: %u bytes\n", msg->len);
-		*error = -EIO;
-		goto out_err;
-	}
-
-	iph = (struct iphdr *) msg->data;
-	if (msg->len < (iph->ihl*4 + sizeof(*greh) + 2)) {
-		LOGP(DNS, LOGL_ERROR, "Short IP packet: %u bytes\n", msg->len);
-		*error = -EIO;
-		goto out_err;
-	}
-
-	greh = (struct gre_hdr *) (msg->data + iph->ihl*4);
-	if (greh->flags) {
-		LOGP(DNS, LOGL_NOTICE, "Unknown GRE flags 0x%04x\n",
-			ntohs(greh->flags));
-	}
-
-	switch (ntohs(greh->ptype)) {
-	case GRE_PTYPE_IPv4:
-		/* IPv4 messages might be GRE keepalives */
-		*error = handle_rx_gre_ipv4(bfd, msg, iph, greh);
-		goto out_err;
-		break;
-	case GRE_PTYPE_FR:
-		/* continue as usual */
-		break;
-	default:
-		LOGP(DNS, LOGL_NOTICE, "Unknown GRE protocol 0x%04x != FR\n",
-			ntohs(greh->ptype));
-		*error = -EIO;
-		goto out_err;
-		break;
-	}
-
-	if (msg->len < sizeof(*greh) + 2) {
-		LOGP(DNS, LOGL_ERROR, "Short FR header: %u bytes\n", msg->len);
-		*error = -EIO;
-		goto out_err;
-	}
-
-	frh = (uint8_t *)greh + sizeof(*greh);
-	if (frh[0] & 0x01) {
-		LOGP(DNS, LOGL_NOTICE, "Unsupported single-byte FR address\n");
-		*error = -EIO;
-		goto out_err;
-	}
-	dlci = ((frh[0] & 0xfc) << 2);
-	if ((frh[1] & 0x0f) != 0x01) {
-		LOGP(DNS, LOGL_NOTICE, "Unknown second FR octet 0x%02x\n",
-			frh[1]);
-		*error = -EIO;
-		goto out_err;
-	}
-	dlci |= (frh[1] >> 4);
-
-	msg->l2h = frh+2;
-
-	/* Store DLCI in NETWORK BYTEORDER in sockaddr port member */
-	saddr->sin_port = htons(dlci);
-
-	return msg;
-
-out_err:
-	msgb_free(msg);
-	return NULL;
-}
-
-int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
-		   struct sockaddr_in *saddr, enum gprs_ns_ll ll);
-
-static int handle_nsfrgre_read(struct bsc_fd *bfd)
-{
-	int rc;
-	struct sockaddr_in saddr;
-	struct gprs_ns_inst *nsi = bfd->data;
-	struct msgb *msg;
-	uint16_t dlci;
-
-	msg = read_nsfrgre_msg(bfd, &rc, &saddr);
-	if (!msg)
-		return rc;
-
-	dlci = ntohs(saddr.sin_port);
-	if (dlci == 0 || dlci == 1023) {
-		LOGP(DNS, LOGL_INFO, "Received FR on LMI DLCI %u - ignoring\n",
-			dlci);
-		rc = 0;
-		goto out;
-	}
-
-	rc = gprs_ns_rcvmsg(nsi, msg, &saddr, GPRS_NS_LL_FR_GRE);
-out:
-	msgb_free(msg);
-
-	return rc;
-}
-
-static int handle_nsfrgre_write(struct bsc_fd *bfd)
-{
-	/* FIXME: actually send the data here instead of nsip_sendmsg() */
-	return -EIO;
-}
-
-int gprs_ns_frgre_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg)
-{
-	int rc;
-	struct gprs_ns_inst *nsi = nsvc->nsi;
-	struct sockaddr_in daddr;
-	uint16_t dlci = ntohs(nsvc->frgre.bts_addr.sin_port);
-	uint8_t *frh;
-	struct gre_hdr *greh;
-
-	/* Build socket address for the packet destionation */
-	daddr.sin_family = AF_INET;
-	daddr.sin_addr = nsvc->frgre.bts_addr.sin_addr;
-	daddr.sin_port = IPPROTO_GRE;
-
-	/* Prepend the FR header */
-	frh = msgb_push(msg, 2);
-	frh[0] = (dlci >> 2) & 0xfc;
-	frh[1] = ((dlci & 0xf)<<4) | 0x01;
-
-	/* Prepend the GRE header */
-	greh = (struct gre_hdr *) msgb_push(msg, sizeof(*greh));
-	greh->flags = 0;
-	greh->ptype = htons(GRE_PTYPE_FR);
-
-	rc = sendto(nsi->frgre.fd.fd, msg->data, msg->len, 0,
-		  (struct sockaddr *)&daddr, sizeof(daddr));
-
-	talloc_free(msg);
-
-	return rc;
-}
-
-static int nsfrgre_fd_cb(struct bsc_fd *bfd, unsigned int what)
-{
-	int rc = 0;
-
-	if (what & BSC_FD_READ)
-		rc = handle_nsfrgre_read(bfd);
-	if (what & BSC_FD_WRITE)
-		rc = handle_nsfrgre_write(bfd);
-
-	return rc;
-}
-
-int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi)
-{
-	int rc;
-
-	/* Make sure we close any existing socket before changing it */
-	if (nsi->frgre.fd.fd)
-		close(nsi->frgre.fd.fd);
-
-	if (!nsi->frgre.enabled)
-		return 0;
-
-	rc = make_sock(&nsi->frgre.fd, IPPROTO_GRE, nsi->frgre.local_ip,
-			0, nsfrgre_fd_cb);
-	if (rc < 0) {
-		LOGP(DNS, LOGL_ERROR, "Error creating GRE socket (%s)\n",
-			strerror(errno));
-		return rc;
-	}
-	nsi->frgre.fd.data = nsi;
-
-	return rc;
-}
diff --git a/openbsc/src/gprs/gprs_ns_vty.c b/openbsc/src/gprs/gprs_ns_vty.c
deleted file mode 100644
index 39277fc..0000000
--- a/openbsc/src/gprs/gprs_ns_vty.c
+++ /dev/null
@@ -1,569 +0,0 @@
-/* VTY interface for our GPRS Networks Service (NS) implementation */
-
-/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdint.h>
-
-#include <arpa/inet.h>
-
-#include <openbsc/gsm_data.h>
-#include <osmocore/msgb.h>
-#include <osmocore/tlv.h>
-#include <osmocore/talloc.h>
-#include <osmocore/select.h>
-#include <osmocore/rate_ctr.h>
-#include <openbsc/debug.h>
-#include <openbsc/signal.h>
-#include <openbsc/gprs_ns.h>
-#include <openbsc/gprs_bssgp.h>
-#include <openbsc/vty.h>
-
-#include <osmocom/vty/vty.h>
-#include <osmocom/vty/command.h>
-#include <osmocom/vty/logging.h>
-#include <osmocom/vty/telnet_interface.h>
-
-static struct gprs_ns_inst *vty_nsi = NULL;
-
-/* FIXME: this should go to some common file as it is copied
- * in vty_interface.c of the BSC */
-static const struct value_string gprs_ns_timer_strs[] = {
-	{ 0, "tns-block" },
-	{ 1, "tns-block-retries" },
-	{ 2, "tns-reset" },
-	{ 3, "tns-reset-retries" },
-	{ 4, "tns-test" },
-	{ 5, "tns-alive" },
-	{ 6, "tns-alive-retries" },
-	{ 0, NULL }
-};
-
-static struct cmd_node ns_node = {
-	NS_NODE,
-	"%s(ns)#",
-	1,
-};
-
-static int config_write_ns(struct vty *vty)
-{
-	struct gprs_nsvc *nsvc;
-	unsigned int i;
-	struct in_addr ia;
-
-	vty_out(vty, "ns%s", VTY_NEWLINE);
-
-	llist_for_each_entry(nsvc, &vty_nsi->gprs_nsvcs, list) {
-		if (!nsvc->persistent)
-			continue;
-		vty_out(vty, " nse %u nsvci %u%s",
-			nsvc->nsei, nsvc->nsvci, VTY_NEWLINE);
-		vty_out(vty, " nse %u remote-role %s%s",
-			nsvc->nsei, nsvc->remote_end_is_sgsn ? "sgsn" : "bss",
-			VTY_NEWLINE);
-		switch (nsvc->ll) {
-		case GPRS_NS_LL_UDP:
-			vty_out(vty, " nse %u encapsulation udp%s", nsvc->nsei,
-				VTY_NEWLINE);
-			vty_out(vty, " nse %u remote-ip %s%s",
-				nsvc->nsei,
-				inet_ntoa(nsvc->ip.bts_addr.sin_addr),
-				VTY_NEWLINE);
-			vty_out(vty, " nse %u remote-port %u%s",
-				nsvc->nsei, ntohs(nsvc->ip.bts_addr.sin_port),
-				VTY_NEWLINE);
-			break;
-		case GPRS_NS_LL_FR_GRE:
-			vty_out(vty, " nse %u encapsulation framerelay-gre%s",
-				nsvc->nsei, VTY_NEWLINE);
-			vty_out(vty, " nse %u remote-ip %s%s",
-				nsvc->nsei,
-				inet_ntoa(nsvc->frgre.bts_addr.sin_addr),
-				VTY_NEWLINE);
-			vty_out(vty, " nse %u fr-dlci %u%s",
-				nsvc->nsei, ntohs(nsvc->frgre.bts_addr.sin_port),
-				VTY_NEWLINE);
-		default:
-			break;
-		}
-	}
-
-	for (i = 0; i < ARRAY_SIZE(vty_nsi->timeout); i++)
-		vty_out(vty, " timer %s %u%s",
-			get_value_string(gprs_ns_timer_strs, i),
-			vty_nsi->timeout[i], VTY_NEWLINE);
-
-	if (vty_nsi->nsip.local_ip) {
-		ia.s_addr = htonl(vty_nsi->nsip.local_ip);
-		vty_out(vty, " encapsulation udp local-ip %s%s",
-			inet_ntoa(ia), VTY_NEWLINE);
-	}
-	if (vty_nsi->nsip.local_port)
-		vty_out(vty, " encapsulation udp local-port %u%s",
-			vty_nsi->nsip.local_port, VTY_NEWLINE);
-
-	vty_out(vty, " encapsulation framerelay-gre enabled %u%s",
-		vty_nsi->frgre.enabled ? 1 : 0, VTY_NEWLINE);
-	if (vty_nsi->frgre.local_ip) {
-		ia.s_addr = htonl(vty_nsi->frgre.local_ip);
-		vty_out(vty, " encapsulation framerelay-gre local-ip %s%s",
-			inet_ntoa(ia), VTY_NEWLINE);
-	}
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_ns, cfg_ns_cmd,
-      "ns",
-      "Configure the GPRS Network Service")
-{
-	vty->node = NS_NODE;
-	return CMD_SUCCESS;
-}
-
-static void dump_nse(struct vty *vty, struct gprs_nsvc *nsvc, int stats)
-{
-	vty_out(vty, "NSEI %5u, NS-VC %5u, Remote: %-4s, %5s %9s",
-		nsvc->nsei, nsvc->nsvci,
-		nsvc->remote_end_is_sgsn ? "SGSN" : "BSS",
-		nsvc->state & NSE_S_ALIVE ? "ALIVE" : "DEAD",
-		nsvc->state & NSE_S_BLOCKED ? "BLOCKED" : "UNBLOCKED");
-	if (nsvc->ll == GPRS_NS_LL_UDP || nsvc->ll == GPRS_NS_LL_FR_GRE)
-		vty_out(vty, ", %s %15s:%u",
-			nsvc->ll == GPRS_NS_LL_UDP ? "UDP   " : "FR-GRE",
-			inet_ntoa(nsvc->ip.bts_addr.sin_addr),
-			ntohs(nsvc->ip.bts_addr.sin_port));
-	vty_out(vty, "%s", VTY_NEWLINE);
-	if (stats)
-		vty_out_rate_ctr_group(vty, " ", nsvc->ctrg);
-}
-
-static void dump_ns(struct vty *vty, struct gprs_ns_inst *nsi, int stats)
-{
-	struct gprs_nsvc *nsvc;
-	struct in_addr ia;
-
-	ia.s_addr = htonl(vty_nsi->nsip.local_ip);
-	vty_out(vty, "Encapsulation NS-UDP-IP     Local IP: %s, UDP Port: %u%s",
-		inet_ntoa(ia), vty_nsi->nsip.local_port, VTY_NEWLINE);
-
-	ia.s_addr = htonl(vty_nsi->frgre.local_ip);
-	vty_out(vty, "Encapsulation NS-FR-GRE-IP  Local IP: %s%s",
-		inet_ntoa(ia), VTY_NEWLINE);
-
-	llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
-		if (nsvc == nsi->unknown_nsvc)
-			continue;
-		dump_nse(vty, nsvc, stats);
-	}
-}
-
-DEFUN(show_ns, show_ns_cmd, "show ns",
-	SHOW_STR "Display information about the NS protocol")
-{
-	struct gprs_ns_inst *nsi = vty_nsi;
-	dump_ns(vty, nsi, 0);
-	return CMD_SUCCESS;
-}
-
-DEFUN(show_ns_stats, show_ns_stats_cmd, "show ns stats",
-	SHOW_STR
-	"Display information about the NS protocol\n"
-	"Include statistics\n")
-{
-	struct gprs_ns_inst *nsi = vty_nsi;
-	dump_ns(vty, nsi, 1);
-	return CMD_SUCCESS;
-}
-
-DEFUN(show_nse, show_nse_cmd, "show ns (nsei|nsvc) <0-65535> [stats]",
-	SHOW_STR "Display information about the NS protocol\n"
-	"Select one NSE by its NSE Identifier\n"
-	"Select one NSE by its NS-VC Identifier\n"
-	"The Identifier of selected type\n"
-	"Include Statistics\n")
-{
-	struct gprs_ns_inst *nsi = vty_nsi;
-	struct gprs_nsvc *nsvc;
-	uint16_t id = atoi(argv[1]);
-	int show_stats = 0;
-
-	if (!strcmp(argv[0], "nsei"))
-		nsvc = nsvc_by_nsei(nsi, id);
-	else
-		nsvc = nsvc_by_nsvci(nsi, id);
-
-	if (!nsvc) {
-		vty_out(vty, "No such NS Entity%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (argc >= 3)
-		show_stats = 1;
-
-	dump_nse(vty, nsvc, show_stats);
-	return CMD_SUCCESS;
-}
-
-#define NSE_CMD_STR "Persistent NS Entity\n" "NS Entity ID (NSEI)\n"
-
-DEFUN(cfg_nse_nsvc, cfg_nse_nsvci_cmd,
-	"nse <0-65535> nsvci <0-65534>",
-	NSE_CMD_STR
-	"NS Virtual Connection\n"
-	"NS Virtual Connection ID (NSVCI)\n"
-	)
-{
-	uint16_t nsei = atoi(argv[0]);
-	uint16_t nsvci = atoi(argv[1]);
-	struct gprs_nsvc *nsvc;
-
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
-	if (!nsvc) {
-		nsvc = nsvc_create(vty_nsi, nsvci);
-		nsvc->nsei = nsei;
-	}
-	nsvc->nsvci = nsvci;
-	/* All NSVCs that are explicitly configured by VTY are
-	 * marked as persistent so we can write them to the config
-	 * file at some later point */
-	nsvc->persistent = 1;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_remoteip, cfg_nse_remoteip_cmd,
-	"nse <0-65535> remote-ip A.B.C.D",
-	NSE_CMD_STR
-	"Remote IP Address\n"
-	"Remote IP Address\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	struct gprs_nsvc *nsvc;
-
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
-	if (!nsvc) {
-		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	inet_aton(argv[1], &nsvc->ip.bts_addr.sin_addr);
-
-	return CMD_SUCCESS;
-
-}
-
-DEFUN(cfg_nse_remoteport, cfg_nse_remoteport_cmd,
-	"nse <0-65535> remote-port <0-65535>",
-	NSE_CMD_STR
-	"Remote UDP Port\n"
-	"Remote UDP Port Number\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	uint16_t port = atoi(argv[1]);
-	struct gprs_nsvc *nsvc;
-
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
-	if (!nsvc) {
-		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (nsvc->ll != GPRS_NS_LL_UDP) {
-		vty_out(vty, "Cannot set UDP Port on non-UDP NSE%s",
-			VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	nsvc->ip.bts_addr.sin_port = htons(port);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_fr_dlci, cfg_nse_fr_dlci_cmd,
-	"nse <0-65535> fr-dlci <16-1007>",
-	NSE_CMD_STR
-	"Frame Relay DLCI\n"
-	"Frame Relay DLCI Number\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	uint16_t dlci = atoi(argv[1]);
-	struct gprs_nsvc *nsvc;
-
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
-	if (!nsvc) {
-		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (nsvc->ll != GPRS_NS_LL_FR_GRE) {
-		vty_out(vty, "Cannot set FR DLCI on non-FR NSE%s",
-			VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	nsvc->frgre.bts_addr.sin_port = htons(dlci);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_encaps, cfg_nse_encaps_cmd,
-	"nse <0-65535> encapsulation (udp|framerelay-gre)",
-	NSE_CMD_STR
-	"Encapsulation for NS\n"
-	"UDP/IP Encapsulation\n" "Frame-Relay/GRE/IP Encapsulation\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	struct gprs_nsvc *nsvc;
-
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
-	if (!nsvc) {
-		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!strcmp(argv[1], "udp"))
-		nsvc->ll = GPRS_NS_LL_UDP;
-	else
-		nsvc->ll = GPRS_NS_LL_FR_GRE;
-
-	return CMD_SUCCESS;
-}
-
-
-DEFUN(cfg_nse_remoterole, cfg_nse_remoterole_cmd,
-	"nse <0-65535> remote-role (sgsn|bss)",
-	NSE_CMD_STR
-	"Remote NSE Role\n"
-	"Remote Peer is SGSN\n"
-	"Remote Peer is BSS\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	struct gprs_nsvc *nsvc;
-
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
-	if (!nsvc) {
-		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!strcmp(argv[1], "sgsn"))
-		nsvc->remote_end_is_sgsn = 1;
-	else
-		nsvc->remote_end_is_sgsn = 0;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_no_nse, cfg_no_nse_cmd,
-	"no nse <0-65535>",
-	"Delete Persistent NS Entity\n"
-	"Delete " NSE_CMD_STR)
-{
-	uint16_t nsei = atoi(argv[0]);
-	struct gprs_nsvc *nsvc;
-
-	nsvc = nsvc_by_nsei(vty_nsi, nsei);
-	if (!nsvc) {
-		vty_out(vty, "No such NSE (%u)%s", nsei, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!nsvc->persistent) {
-		vty_out(vty, "NSEI %u is not a persistent NSE%s",
-			nsei, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	nsvc->persistent = 0;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_ns_timer, cfg_ns_timer_cmd,
-	"timer " NS_TIMERS " <0-65535>",
-	"Network Service Timer\n"
-	NS_TIMERS_HELP "Timer Value\n")
-{
-	int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
-	int val = atoi(argv[1]);
-
-	if (idx < 0 || idx >= ARRAY_SIZE(vty_nsi->timeout))
-		return CMD_WARNING;
-
-	vty_nsi->timeout[idx] = val;
-
-	return CMD_SUCCESS;
-}
-
-#define ENCAPS_STR "NS encapsulation options\n"
-
-DEFUN(cfg_nsip_local_ip, cfg_nsip_local_ip_cmd,
-      "encapsulation udp local-ip A.B.C.D",
-	ENCAPS_STR "NS over UDP Encapsulation\n"
-	"Set the IP address on which we listen for NS/UDP\n"
-	"IP Address\n")
-{
-	struct in_addr ia;
-
-	inet_aton(argv[0], &ia);
-	vty_nsi->nsip.local_ip = ntohl(ia.s_addr);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nsip_local_port, cfg_nsip_local_port_cmd,
-      "encapsulation udp local-port <0-65535>",
-	ENCAPS_STR "NS over UDP Encapsulation\n"
-	"Set the UDP port on which we listen for NS/UDP\n"
-	"UDP port number\n")
-{
-	unsigned int port = atoi(argv[0]);
-
-	vty_nsi->nsip.local_port = port;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_frgre_local_ip, cfg_frgre_local_ip_cmd,
-      "encapsulation framerelay-gre local-ip A.B.C.D",
-	ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
-	"Set the IP address on which we listen for NS/FR/GRE\n"
-	"IP Address\n")
-{
-	struct in_addr ia;
-
-	if (!vty_nsi->frgre.enabled) {
-		vty_out(vty, "FR/GRE is not enabled%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	inet_aton(argv[0], &ia);
-	vty_nsi->frgre.local_ip = ntohl(ia.s_addr);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_frgre_enable, cfg_frgre_enable_cmd,
-      "encapsulation framerelay-gre enabled (1|0)",
-	ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
-	"Enable or disable Frame Relay over GRE\n"
-	"Enable\n" "Disable\n")
-{
-	int enabled = atoi(argv[0]);
-
-	vty_nsi->frgre.enabled = enabled;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(nsvc_nsei, nsvc_nsei_cmd,
-	"nsvc nsei <0-65535> (block|unblock|reset)",
-	"Perform an operation on a NSVC\n"
-	"NS-VC Identifier (NS-VCI)\n"
-	"Initiate BLOCK procedure\n"
-	"Initiate UNBLOCK procedure\n"
-	"Initiate RESET procedure\n")
-{
-	uint16_t nsvci = atoi(argv[0]);
-	const char *operation = argv[1];
-	struct gprs_nsvc *nsvc;
-
-	nsvc = nsvc_by_nsei(vty_nsi, nsvci);
-	if (!nsvc) {
-		vty_out(vty, "No such NSVCI (%u)%s", nsvci, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!strcmp(operation, "block"))
-		gprs_ns_tx_block(nsvc, NS_CAUSE_OM_INTERVENTION);
-	else if (!strcmp(operation, "unblock"))
-		gprs_ns_tx_unblock(nsvc);
-	else if (!strcmp(operation, "reset"))
-		gprs_nsvc_reset(nsvc, NS_CAUSE_OM_INTERVENTION);
-	else
-		return CMD_WARNING;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(logging_fltr_nsvc,
-      logging_fltr_nsvc_cmd,
-      "logging filter nsvc (nsei|nsvci) <0-65535>",
-	LOGGING_STR FILTER_STR
-	"Filter based on NS Virtual Connection\n"
-	"Identify NS-VC by NSEI\n"
-	"Identify NS-VC by NSVCI\n"
-	"Numeric identifier\n")
-{
-	struct log_target *tgt = osmo_log_vty2tgt(vty);
-	struct gprs_nsvc *nsvc;
-	uint16_t id = atoi(argv[1]);
-
-	if (!tgt)
-		return CMD_WARNING;
-
-	if (!strcmp(argv[0], "nsei"))
-		nsvc = nsvc_by_nsei(vty_nsi, id);
-	else
-		nsvc = nsvc_by_nsvci(vty_nsi, id);
-
-	if (!nsvc) {
-		vty_out(vty, "No NS-VC by that identifier%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	log_set_nsvc_filter(tgt, nsvc);
-	return CMD_SUCCESS;
-}
-
-int gprs_ns_vty_init(struct gprs_ns_inst *nsi)
-{
-	vty_nsi = nsi;
-
-	install_element_ve(&show_ns_cmd);
-	install_element_ve(&show_ns_stats_cmd);
-	install_element_ve(&show_nse_cmd);
-	install_element_ve(&logging_fltr_nsvc_cmd);
-
-	install_element(CFG_LOG_NODE, &logging_fltr_nsvc_cmd);
-
-	install_element(CONFIG_NODE, &cfg_ns_cmd);
-	install_node(&ns_node, config_write_ns);
-	install_default(NS_NODE);
-	install_element(NS_NODE, &ournode_exit_cmd);
-	install_element(NS_NODE, &ournode_end_cmd);
-	install_element(NS_NODE, &cfg_nse_nsvci_cmd);
-	install_element(NS_NODE, &cfg_nse_remoteip_cmd);
-	install_element(NS_NODE, &cfg_nse_remoteport_cmd);
-	install_element(NS_NODE, &cfg_nse_fr_dlci_cmd);
-	install_element(NS_NODE, &cfg_nse_encaps_cmd);
-	install_element(NS_NODE, &cfg_nse_remoterole_cmd);
-	install_element(NS_NODE, &cfg_no_nse_cmd);
-	install_element(NS_NODE, &cfg_ns_timer_cmd);
-	install_element(NS_NODE, &cfg_nsip_local_ip_cmd);
-	install_element(NS_NODE, &cfg_nsip_local_port_cmd);
-	install_element(NS_NODE, &cfg_frgre_enable_cmd);
-	install_element(NS_NODE, &cfg_frgre_local_ip_cmd);
-
-	install_element(ENABLE_NODE, &nsvc_nsei_cmd);
-
-	return 0;
-}
