diff --git a/include/internal.h b/include/internal.h
index ddb2ae2..46b622f 100644
--- a/include/internal.h
+++ b/include/internal.h
@@ -13,9 +13,8 @@
 /* use libosmo_abis_init, this is only for internal use. */
 void e1inp_init(void);
 
-/* hsl requires these functions defined in ipaccess driver. */
+/* ipaccess.c requires these functions defined here */
 struct msgb;
-void ipaccess_prepend_header(struct msgb *msg, int proto);
 struct msgb *ipa_msg_alloc(int headroom);
 void ipa_msg_push_header(struct msgb *msg, uint8_t proto);
 
diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h
index 16e7f8b..c813dd4 100644
--- a/include/osmocom/abis/e1_input.h
+++ b/include/osmocom/abis/e1_input.h
@@ -262,7 +262,6 @@
 
 struct gsm_network;
 int ipaccess_setup(struct gsm_network *gsmnet);
-int hsl_setup(struct gsm_network *gsmnet);
 
 extern struct llist_head e1inp_driver_list;
 extern struct llist_head e1inp_line_list;
diff --git a/include/osmocom/abis/ipaccess.h b/include/osmocom/abis/ipaccess.h
index 7af882a..3b43a69 100644
--- a/include/osmocom/abis/ipaccess.h
+++ b/include/osmocom/abis/ipaccess.h
@@ -103,11 +103,6 @@
 	char *serno;
 };
 
-struct hsl_unit {
-	uint8_t swversion;
-	uint64_t serno;
-};
-
 /* quick solution to get openBSC's ipaccess tools working. */
 extern int ipaccess_fd_cb(struct osmo_fd *bfd, unsigned int what);
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 41804d0..05d32b1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -19,7 +19,6 @@
 			 subchan_demux.c \
 			 trau_frame.c \
 			 input/dahdi.c \
-			 input/hsl.c \
 			 input/ipa.c \
 			 input/ipaccess.c \
 			 input/lapd.c \
diff --git a/src/e1_input.c b/src/e1_input.c
index a85dd91..461713f 100644
--- a/src/e1_input.c
+++ b/src/e1_input.c
@@ -743,7 +743,6 @@
 void e1inp_misdn_init(void);
 void e1inp_dahdi_init(void);
 void e1inp_ipaccess_init(void);
-void e1inp_hsl_init(void);
 void e1inp_rs232_init(void);
 
 void e1inp_init(void)
@@ -758,6 +757,5 @@
 	e1inp_dahdi_init();
 #endif
 	e1inp_ipaccess_init();
-	e1inp_hsl_init();
 	e1inp_rs232_init();
 }
diff --git a/src/e1_input_vty.c b/src/e1_input_vty.c
index cca7e8f..efe2bca 100644
--- a/src/e1_input_vty.c
+++ b/src/e1_input_vty.c
@@ -38,7 +38,7 @@
 
 /* CONFIG */
 
-#define E1_DRIVER_NAMES		"(misdn|misdn_lapd|dahdi|ipa|hsl)"
+#define E1_DRIVER_NAMES		"(misdn|misdn_lapd|dahdi|ipa)"
 #define E1_DRIVER_HELP		"mISDN supported E1 Card (kernel LAPD)\n" \
 				"mISDN supported E1 Card (userspace LAPD)\n" \
 				"DAHDI supported E1/T1/J1 Card\n" \
diff --git a/src/input/hsl.c b/src/input/hsl.c
deleted file mode 100644
index 1a60c2b..0000000
--- a/src/input/hsl.c
+++ /dev/null
@@ -1,538 +0,0 @@
-/* OpenBSC Abis input driver for HSL Femto */
-
-/* (C) 2011 by Harald Welte <laforge@gnumonks.org>
- * (C) 2011 by On-Waves
- *
- * 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/>.
- *
- */
-
-/* HSL uses a much more primitive/simplified version of the IPA multiplex.
- *
- * They have taken out the nice parts like the ID_GET / ID_RESP for resolving
- * the UNIT ID, as well as the keepalive ping/pong messages.  Furthermore, the
- * Stream Identifiers are fixed on the BTS side (RSL always 0, OML always 0xff)
- * and both OML+RSL share a single TCP connection.
- *
- * Other oddities include the encapsulation of BSSGP messages in the L3_INFO IE
- * of RSL
- */
-
-#include "internal.h"
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <time.h>
-#include <inttypes.h>
-#include <sys/fcntl.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <arpa/inet.h>
-
-#include <osmocom/core/select.h>
-#include <osmocom/gsm/tlv.h>
-#include <osmocom/core/msgb.h>
-#include <osmocom/abis/e1_input.h>
-#include <osmocom/core/logging.h>
-#include <osmocom/abis/ipaccess.h>
-#include <osmocom/core/socket.h>
-#include <osmocom/abis/ipa.h>
-#include <osmocom/core/talloc.h>
-
-#define HSL_TCP_PORT	2500
-#define HSL_PROTO_DEBUG	0xdd
-
-#define PRIV_OML 1
-#define PRIV_RSL 2
-
-static void *tall_hsl_ctx;
-
-/* data structure for one E1 interface with A-bis */
-struct hsl_e1_handle {
-	struct osmo_fd listen_fd;
-	struct gsm_network *gsmnet;
-};
-
-static struct hsl_e1_handle *e1h;
-
-
-#define TS1_ALLOC_SIZE	900
-
-static void hsl_drop(struct e1inp_line *line, struct osmo_fd *bfd)
-{
-	line->ops->sign_link_down(line);
-
-	if (bfd->fd != -1) {
-		osmo_fd_unregister(bfd);
-		close(bfd->fd);
-		bfd->fd = -1;
-	}
-}
-
-static int process_hsl_rsl(struct msgb *msg, struct e1inp_line *line,
-			   struct osmo_fd *bfd)
-{
-	char serno_buf[16];
-	uint8_t serno_len;
-	struct e1inp_sign_link *sign_link;
-	struct hsl_unit unit_data;
-
-	switch (msg->l2h[1]) {
-	case 0x80:
-		/*, contains Serial Number + SW version */
-		if (msg->l2h[2] != 0xc0)
-			break;
-		serno_len = msg->l2h[3];
-		if (serno_len > sizeof(serno_buf)-1)
-			serno_len = sizeof(serno_buf)-1;
-		memcpy(serno_buf, msg->l2h+4, serno_len);
-		serno_buf[serno_len] = '\0';
-		unit_data.serno = strtoul(serno_buf, NULL, 10);
-
-		if (!line->ops->sign_link_up) {
-			LOGP(DLINP, LOGL_ERROR,
-			     "Unable to set signal link, closing socket.\n");
-			osmo_fd_unregister(bfd);
-			close(bfd->fd);
-			bfd->fd = -1;
-			return -EINVAL;
-		}
-		sign_link = line->ops->sign_link_up(&unit_data,
-						    line, E1INP_SIGN_NONE);
-		if (sign_link == NULL) {
-			LOGP(DLINP, LOGL_ERROR,
-			     "Unable to set signal link, closing socket.\n");
-			osmo_fd_unregister(bfd);
-			close(bfd->fd);
-			bfd->fd = -1;
-			return -EINVAL;
-		}
-		msgb_free(msg);
-		return 1;       /* == we have taken over the msg */
-	case 0x82:
-		/* FIXME: do something with BSSGP, i.e. forward it over
-		 * NSIP to OsmoSGSN */
-		msgb_free(msg);
-		return 1;
-	}
-	return 0;
-}
-
-static int handle_ts1_read(struct osmo_fd *bfd)
-{
-	struct e1inp_line *line = bfd->data;
-	unsigned int ts_nr = bfd->priv_nr;
-	struct e1inp_ts *e1i_ts = &line->ts[ts_nr-1];
-	struct e1inp_sign_link *link;
-	struct ipaccess_head *hh;
-	struct msgb *msg;
-	int ret = 0, error;
-
-	error = ipa_msg_recv(bfd->fd, &msg);
-	if (error < 0)
-		return error;
-	else if (error == 0) {
-		hsl_drop(e1i_ts->line, bfd);
-		LOGP(DLINP, LOGL_NOTICE, "Sign link vanished, dead socket\n");
-		return error;
-	}
-	DEBUGP(DLMI, "RX %u: %s\n", ts_nr, osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
-
-	hh = (struct ipaccess_head *) msg->data;
-	if (hh->proto == HSL_PROTO_DEBUG) {
-		LOGP(DLINP, LOGL_NOTICE, "HSL debug: %s\n", msg->data + sizeof(*hh));
-		msgb_free(msg);
-		return ret;
-	}
-
-	/* HSL proprietary RSL extension */
-	if (hh->proto == 0 && (msg->l2h[0] == 0x81 || msg->l2h[0] == 0x80)) {
-                ret = process_hsl_rsl(msg, line, bfd);
-                if (ret < 0) {
-                        hsl_drop(e1i_ts->line, bfd);
-                        return ret;
-		} else if (ret == 1)
-			return 0;
-		/* else: continue... */
-	}
-
-#ifdef HSL_SR_1_0
-	/* HSL for whatever reason chose to use 0x81 instead of 0x80 for FOM */
-	if (hh->proto == 255 && msg->l2h[0] == (ABIS_OM_MDISC_FOM | 0x01))
-		msg->l2h[0] = ABIS_OM_MDISC_FOM;
-#endif
-	link = e1inp_lookup_sign_link(e1i_ts, hh->proto, 0);
-	if (!link) {
-		LOGP(DLINP, LOGL_ERROR, "no matching signalling link for "
-			"hh->proto=0x%02x\n", hh->proto);
-		msgb_free(msg);
-		return -EIO;
-	}
-	msg->dst = link;
-
-	/* XXX: better use e1inp_ts_rx? */
-	if (!e1i_ts->line->ops->sign_link) {
-		LOGP(DLINP, LOGL_ERROR, "Fix your application, "
-			"no action set for signalling messages.\n");
-		return -ENOENT;
-	}
-	e1i_ts->line->ops->sign_link(msg);
-
-	return ret;
-}
-
-static int ts_want_write(struct e1inp_ts *e1i_ts)
-{
-	e1i_ts->driver.ipaccess.fd.when |= BSC_FD_WRITE;
-
-	return 0;
-}
-
-static void timeout_ts1_write(void *data)
-{
-	struct e1inp_ts *e1i_ts = (struct e1inp_ts *)data;
-
-	/* trigger write of ts1, due to tx delay timer */
-	ts_want_write(e1i_ts);
-}
-
-static int __handle_ts1_write(struct osmo_fd *bfd, struct e1inp_line *line)
-{
-	unsigned int ts_nr = bfd->priv_nr;
-	struct e1inp_ts *e1i_ts = &line->ts[ts_nr-1];
-	struct e1inp_sign_link *sign_link;
-	struct msgb *msg;
-	int ret;
-
-	bfd->when &= ~BSC_FD_WRITE;
-
-	/* get the next msg for this timeslot */
-	msg = e1inp_tx_ts(e1i_ts, &sign_link);
-	if (!msg) {
-		/* no message after tx delay timer */
-		return 0;
-	}
-
-	switch (sign_link->type) {
-	case E1INP_SIGN_OML:
-#ifdef HSL_SR_1_0
-		/* HSL uses 0x81 for FOM for some reason */
-		if (msg->data[0] == ABIS_OM_MDISC_FOM)
-			msg->data[0] = ABIS_OM_MDISC_FOM | 0x01;
-#endif
-		break;
-	case E1INP_SIGN_RSL:
-		break;
-	default:
-		msgb_free(msg);
-		bfd->when |= BSC_FD_WRITE; /* come back for more msg */
-		return -EINVAL;
-	}
-
-	msg->l2h = msg->data;
-	ipaccess_prepend_header(msg, sign_link->tei);
-
-	DEBUGP(DLMI, "TX %u: %s\n", ts_nr, osmo_hexdump(msg->l2h, msgb_l2len(msg)));
-
-	ret = send(bfd->fd, msg->data, msg->len, 0);
-	msgb_free(msg);
-
-	/* set tx delay timer for next event */
-	e1i_ts->sign.tx_timer.cb = timeout_ts1_write;
-	e1i_ts->sign.tx_timer.data = e1i_ts;
-
-	/* Reducing this might break the nanoBTS 900 init. */
-	osmo_timer_schedule(&e1i_ts->sign.tx_timer, 0, e1i_ts->sign.delay);
-
-	return ret;
-}
-
-static int handle_ts1_write(struct osmo_fd *bfd)
-{
-	struct e1inp_line *line = bfd->data;
-
-	return __handle_ts1_write(bfd, line);
-}
-
-int hsl_bts_write(struct ipa_client_conn *link)
-{
-	struct e1inp_line *line = link->line;
-
-	return __handle_ts1_write(link->ofd, line);
-}
-
-/* callback from select.c in case one of the fd's can be read/written */
-static int hsl_fd_cb(struct osmo_fd *bfd, unsigned int what)
-{
-	struct e1inp_line *line = bfd->data;
-	unsigned int ts_nr = bfd->priv_nr;
-	unsigned int idx = ts_nr-1;
-	struct e1inp_ts *e1i_ts;
-	int rc = 0;
-
-	/* In case of early RSL we might not yet have a line */
-
-	if (line)
-		e1i_ts = &line->ts[idx];
-
-	if (!line || e1i_ts->type == E1INP_TS_TYPE_SIGN) {
-		if (what & BSC_FD_READ)
-			rc = handle_ts1_read(bfd);
-		if (what & BSC_FD_WRITE)
-			rc = handle_ts1_write(bfd);
-	} else
-		LOGP(DLINP, LOGL_ERROR, "unknown E1 TS type %u\n", e1i_ts->type);
-
-	return rc;
-}
-
-static void hsl_close(struct e1inp_sign_link *sign_link)
-{
-	struct e1inp_ts *e1i_ts = sign_link->ts;
-	struct osmo_fd *bfd = &e1i_ts->driver.ipaccess.fd;
-	return e1inp_close_socket(e1i_ts, sign_link, bfd);
-}
-
-static int hsl_line_update(struct e1inp_line *line);
-
-struct e1inp_driver hsl_driver = {
-	.name = "hsl",
-	.want_write = ts_want_write,
-	.line_update = hsl_line_update,
-	.close = hsl_close,
-	.default_delay = 0,
-};
-
-/* callback of the OML listening filedescriptor */
-static int listen_fd_cb(struct osmo_fd *listen_bfd, unsigned int what)
-{
-	int ret;
-	int idx = 0;
-	int i;
-	struct e1inp_line *line;
-	struct e1inp_ts *e1i_ts;
-	struct osmo_fd *bfd;
-	struct sockaddr_in sa;
-	socklen_t sa_len = sizeof(sa);
-
-	if (!(what & BSC_FD_READ))
-		return 0;
-
-	ret = accept(listen_bfd->fd, (struct sockaddr *) &sa, &sa_len);
-	if (ret < 0) {
-		perror("accept");
-		return ret;
-	}
-	LOGP(DLINP, LOGL_NOTICE, "accept()ed new HSL link from %s\n",
-		inet_ntoa(sa.sin_addr));
-
-	/* clone virtual E1 line for this new signalling link. */
-	line = e1inp_line_clone(tall_hsl_ctx, listen_bfd->data);
-	if (line == NULL) {
-		LOGP(DLINP, LOGL_ERROR, "could not clone E1 line\n");
-		return -1;
-	}
-	/* create virrtual E1 timeslots for signalling */
-	e1inp_ts_config_sign(&line->ts[1-1], line);
-
-	/* initialize the fds */
-	for (i = 0; i < ARRAY_SIZE(line->ts); ++i)
-		line->ts[i].driver.ipaccess.fd.fd = -1;
-
-	e1i_ts = &line->ts[idx];
-
-	bfd = &e1i_ts->driver.ipaccess.fd;
-	bfd->fd = ret;
-	bfd->data = line;
-	bfd->priv_nr = PRIV_OML;
-	bfd->cb = hsl_fd_cb;
-	bfd->when = BSC_FD_READ;
-	ret = osmo_fd_register(bfd);
-	if (ret < 0) {
-		LOGP(DLINP, LOGL_ERROR, "could not register FD\n");
-		close(bfd->fd);
-		e1inp_line_put(line);
-		return ret;
-	}
-
-        return ret;
-}
-
-static int hsl_bts_process(struct ipa_client_conn *link, struct msgb *msg)
-{
-	struct ipaccess_head *hh;
-	struct e1inp_sign_link *sign_link;
-	struct e1inp_ts *e1i_ts = &link->line->ts[0];
-
-	hh = (struct ipaccess_head *) msg->data;
-	if (hh->proto == HSL_PROTO_DEBUG) {
-		LOGP(DLINP, LOGL_NOTICE, "HSL debug: %s\n",
-						msg->data + sizeof(*hh));
-		msgb_free(msg);
-		return 0;
-	}
-	sign_link = e1inp_lookup_sign_link(e1i_ts, hh->proto, 0);
-	if (!sign_link) {
-		LOGP(DLINP, LOGL_ERROR, "no matching signalling link for "
-			"hh->proto=0x%02x\n", hh->proto);
-		msgb_free(msg);
-		return -EIO;
-	}
-	msg->dst = sign_link;
-
-	/* XXX better use e1inp_ts_rx? */
-	if (!link->line->ops->sign_link) {
-		LOGP(DLINP, LOGL_ERROR, "Fix your application, "
-			"no action set for signalling messages.\n");
-		return -ENOENT;
-	}
-	link->line->ops->sign_link(msg);
-	return 0;
-}
-
-static int hsl_bts_connect(struct ipa_client_conn *link)
-{
-	struct msgb *msg;
-	uint8_t *serno;
-	char serno_buf[16];
-	struct hsl_unit *unit = link->line->ops->cfg.ipa.dev;
-	struct e1inp_sign_link *sign_link;
-
-	/* send the minimal message to identify this BTS. */
-	msg = ipa_msg_alloc(0);
-	if (!msg)
-		return -ENOMEM;
-
-	*msgb_put(msg, 1) = 0x80;
-	*msgb_put(msg, 1) = 0x80;
-	*msgb_put(msg, 1) = unit->swversion;
-	snprintf(serno_buf, sizeof(serno_buf), "%"PRIx64, unit->serno);
-	serno = msgb_put(msg, strlen(serno_buf)+1);
-	memcpy(serno, serno_buf, strlen(serno_buf));
-	ipa_msg_push_header(msg, 0);
-	send(link->ofd->fd, msg->data, msg->len, 0);
-	msgb_free(msg);
-
-	/* ... and enable the signalling link. */
-	if (!link->line->ops->sign_link_up) {
-		LOGP(DLINP, LOGL_ERROR,
-			"Unable to set signal link, closing socket.\n");
-		ipa_client_conn_close(link);
-		return -EINVAL;
-	}
-	sign_link = link->line->ops->sign_link_up(&unit,
-						  link->line, E1INP_SIGN_NONE);
-	if (sign_link == NULL) {
-		LOGP(DLINP, LOGL_ERROR,
-		     "Unable to set signal link, closing socket.\n");
-		ipa_client_conn_close(link);
-		return -EINVAL;
-	}
-	return 0;
-}
-
-struct hsl_line {
-	int line_already_initialized;
-};
-
-static int hsl_line_update(struct e1inp_line *line)
-{
-	int ret = -ENOENT;
-	struct hsl_line *hl;
-
-	if (!line->driver_data)
-		line->driver_data = talloc_zero(line, struct hsl_line);
-
-	if (!line->driver_data) {
-		LOGP(DLINP, LOGL_NOTICE, "hsl: OOM in line update\n");
-		return -ENOMEM;
-	}
-	hl = line->driver_data;
-
-	/* We only initialize this line once. */
-	if (hl->line_already_initialized)
-		return 0;
-
-	hl->line_already_initialized = 1;
-
-	switch(line->ops->cfg.ipa.role) {
-	case E1INP_LINE_R_BSC:
-		LOGP(DLINP, LOGL_NOTICE, "enabling hsl BSC mode\n");
-
-		ret = osmo_sock_init(AF_INET, SOCK_STREAM, IPPROTO_TCP,
-				     line->ops->cfg.ipa.addr,
-				     HSL_TCP_PORT, OSMO_SOCK_F_BIND);
-		if (ret < 0)
-			return ret;
-
-		e1h->listen_fd.fd = ret;
-		e1h->listen_fd.when |= BSC_FD_READ;
-		e1h->listen_fd.cb = listen_fd_cb;
-		e1h->listen_fd.data = line;
-
-		if (osmo_fd_register(&e1h->listen_fd) < 0) {
-			close(ret);
-			return ret;
-		}
-		break;
-	case E1INP_LINE_R_BTS: {
-		struct ipa_client_conn *link;
-
-		LOGP(DLINP, LOGL_NOTICE, "enabling hsl BTS mode\n");
-
-		link = ipa_client_conn_create(tall_hsl_ctx,
-					      &line->ts[E1INP_SIGN_OML-1],
-					      E1INP_SIGN_OML,
-					      line->ops->cfg.ipa.addr,
-					      HSL_TCP_PORT,
-					      hsl_bts_connect,
-					      hsl_bts_process,
-					      hsl_bts_write,
-					      NULL);
-		if (link == NULL) {
-			LOGP(DLINP, LOGL_ERROR, "cannot create BTS link: %s\n",
-				strerror(errno));
-			return -ENOMEM;
-		}
-		if (ipa_client_conn_open(link) < 0) {
-			LOGP(DLINP, LOGL_ERROR, "cannot open BTS link: %s\n",
-				strerror(errno));
-			ipa_client_conn_close(link);
-			ipa_client_conn_destroy(link);
-			return -EIO;
-		}
-		ret = 0;
-		break;
-	}
-	default:
-		break;
-	}
-	return ret;
-}
-
-void e1inp_hsl_init(void)
-{
-	tall_hsl_ctx = talloc_named_const(libosmo_abis_ctx, 1, "hsl");
-
-	e1h = talloc_zero(tall_hsl_ctx, struct hsl_e1_handle);
-	if (!e1h)
-		return;
-
-	e1inp_driver_register(&hsl_driver);
-}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index fea78fc..af8a9cf 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -4,8 +4,6 @@
 
 check_PROGRAMS = e1inp_ipa_bsc_test	\
 		  e1inp_ipa_bts_test	\
-		  e1inp_hsl_bsc_test	\
-		  e1inp_hsl_bts_test	\
 		  ipa_proxy_test	\
 		  subchan_demux/subchan_demux_test
 
@@ -17,14 +15,6 @@
 e1inp_ipa_bts_test_LDADD = $(top_builddir)/src/libosmoabis.la \
 			$(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)
 
-e1inp_hsl_bsc_test_SOURCES = e1inp_hsl_bsc_test.c
-e1inp_hsl_bsc_test_LDADD = $(top_builddir)/src/libosmoabis.la \
-			$(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)
-
-e1inp_hsl_bts_test_SOURCES = e1inp_hsl_bts_test.c
-e1inp_hsl_bts_test_LDADD = $(top_builddir)/src/libosmoabis.la \
-			$(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)
-
 ipa_proxy_test_SOURCES = ipa_proxy_test.c
 ipa_proxy_test_LDADD = $(top_builddir)/src/libosmoabis.la \
 			$(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) \
diff --git a/tests/e1inp_hsl_bsc_test.c b/tests/e1inp_hsl_bsc_test.c
deleted file mode 100644
index a909e02..0000000
--- a/tests/e1inp_hsl_bsc_test.c
+++ /dev/null
@@ -1,236 +0,0 @@
-#include <stdio.h>
-#include <osmocom/core/talloc.h>
-#include <osmocom/abis/abis.h>
-#include <osmocom/abis/e1_input.h>
-#include <osmocom/core/application.h>
-#include <osmocom/core/logging.h>
-#include <osmocom/gsm/protocol/gsm_12_21.h>
-
-static void *tall_test;
-static struct e1inp_sign_link *oml_sign_link, *rsl_sign_link;
-
-#define DBSCTEST 0
-
-struct log_info_cat bsc_test_cat[] = {
-	[DBSCTEST] = {
-		.name = "DBSCTEST",
-		.description = "BSC-mode test",
-		.color = "\033[1;35m",
-		.enabled = 1, .loglevel = LOGL_NOTICE,
-	},
-};
-
-static struct e1inp_sign_link *
-sign_link_up(void *dev, struct e1inp_line *line, enum e1inp_sign_type type)
-{
-	struct e1inp_sign_link *sign_link = NULL;
-
-	LOGP(DBSCTEST, LOGL_NOTICE, "Signal link up request received.\n");
-	e1inp_ts_config_sign(&line->ts[E1INP_SIGN_OML - 1], line);
-	sign_link = oml_sign_link =
-		e1inp_sign_link_create(&line->ts[E1INP_SIGN_OML - 1],
-				       E1INP_SIGN_OML, NULL, 255, 0);
-	if (!oml_sign_link) {
-		LOGP(DBSCTEST, LOGL_ERROR, "OML link not yet set, giving up\n");
-		return NULL;
-	}
-	e1inp_ts_config_sign(&line->ts[E1INP_SIGN_RSL - 1], line);
-	sign_link = rsl_sign_link =
-	     e1inp_sign_link_create(&line->ts[E1INP_SIGN_RSL - 1],
-				    E1INP_SIGN_RSL, NULL, 0, 0);
-	if (sign_link)
-		LOGP(DBSCTEST, LOGL_NOTICE, "signal link has been set up.\n");
-
-	return sign_link;
-}
-
-static void sign_link_down(struct e1inp_line *line)
-{
-	LOGP(DBSCTEST, LOGL_NOTICE, "signal link has been closed\n");
-	if (oml_sign_link)
-		e1inp_sign_link_destroy(oml_sign_link);
-	if (rsl_sign_link)
-		e1inp_sign_link_destroy(rsl_sign_link);
-}
-
-static void fill_om_hdr(struct abis_om_hdr *oh, uint8_t len)
-{
-	oh->mdisc = ABIS_OM_MDISC_FOM;
-	oh->placement = ABIS_OM_PLACEMENT_ONLY;
-	oh->sequence = 0;
-	oh->length = len;
-}
-
-static void fill_om_fom_hdr(struct abis_om_hdr *oh, uint8_t len,
-                            uint8_t msg_type, uint8_t obj_class,
-                            uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr)
-{
-	struct abis_om_fom_hdr *foh =
-		(struct abis_om_fom_hdr *) oh->data;
-
-	fill_om_hdr(oh, len+sizeof(*foh));
-	foh->msg_type = msg_type;
-	foh->obj_class = obj_class;
-	foh->obj_inst.bts_nr = bts_nr;
-	foh->obj_inst.trx_nr = trx_nr;
-	foh->obj_inst.ts_nr = ts_nr;
-}
-
-#define OM_ALLOC_SIZE           1024
-#define OM_HEADROOM_SIZE        128
-
-static struct msgb *nm_msgb_alloc(void)
-{
-	return msgb_alloc_headroom(OM_ALLOC_SIZE, OM_HEADROOM_SIZE, "OML");
-}
-
-
-static int abis_nm_sw_act_req_ack(struct e1inp_sign_link *sign_link,
-				  uint8_t obj_class,
-				  uint8_t i1, uint8_t i2, uint8_t i3,
-				  uint8_t *attr, int att_len)
-{
-	struct abis_om_hdr *oh;
-	struct msgb *msg = nm_msgb_alloc();
-	uint8_t msgtype = NM_MT_SW_ACT_REQ_ACK;
-
-	oh = (struct abis_om_hdr *) msgb_put(msg, ABIS_OM_FOM_HDR_SIZE);
-	fill_om_fom_hdr(oh, att_len, msgtype, obj_class, i1, i2, i3);
-
-	if (attr) {
-		uint8_t *ptr = msgb_put(msg, att_len);
-		memcpy(ptr, attr, att_len);
-	}
-	msg->dst = sign_link;
-	return abis_sendmsg(msg);
-}
-
-static int abis_nm_rx_sw_act_req(struct msgb *msg)
-{
-	struct abis_om_hdr *oh = msgb_l2(msg);
-	struct abis_om_fom_hdr *foh = msgb_l3(msg);
-	int ret;
-
-        ret = abis_nm_sw_act_req_ack(msg->dst,
-				     foh->obj_class,
-				     foh->obj_inst.bts_nr,
-				     foh->obj_inst.trx_nr,
-				     foh->obj_inst.ts_nr,
-				     foh->data, oh->length-sizeof(*foh));
-
-	return ret;
-}
-
-static int abis_nm_rcvmsg_fom(struct msgb *msg)
-{
-	struct abis_om_fom_hdr *foh = msgb_l3(msg);
-	uint8_t mt = foh->msg_type;
-	int ret = 0;
-
-	switch (mt) {
-	case NM_MT_SW_ACT_REQ:	/* Software activate request from BTS. */
-		ret = abis_nm_rx_sw_act_req(msg);
-		break;
-	default:
-		break;
-	}
-	return ret;
-}
-
-static int abis_nm_rcvmsg(struct msgb *msg)
-{
-	int ret = 0;
-	struct abis_om_hdr *oh = msgb_l2(msg);
-
-	msg->l3h = (unsigned char *)oh + sizeof(*oh);
-	switch (oh->mdisc) {
-	case ABIS_OM_MDISC_FOM:
-		ret = abis_nm_rcvmsg_fom(msg);
-		break;
-	default:
-		LOGP(DBSCTEST, LOGL_ERROR, "unknown OML message\n");
-		break;
-	}
-	return ret;
-}
-
-static int sign_link(struct msgb *msg)
-{
-	int ret = 0;
-	struct e1inp_sign_link *link = msg->dst;
-
-	switch(link->type) {
-	case E1INP_SIGN_RSL:
-		LOGP(DBSCTEST, LOGL_NOTICE, "RSL message received.\n");
-		break;
-	case E1INP_SIGN_OML:
-		LOGP(DBSCTEST, LOGL_NOTICE, "OML message received.\n");
-		ret = abis_nm_rcvmsg(msg);
-		break;
-	default:
-		LOGP(DBSCTEST, LOGL_ERROR, "Unknown signallin message.\n");
-		break;
-	}
-	return ret;
-}
-
-const struct log_info bsc_test_log_info = {
-        .filter_fn = NULL,
-        .cat = bsc_test_cat,
-        .num_cat = ARRAY_SIZE(bsc_test_cat),
-};
-
-int main(void)
-{
-	struct e1inp_line *line;
-
-	tall_test = talloc_named_const(NULL, 1, "e1inp_test");
-	libosmo_abis_init(tall_test);
-
-	osmo_init_logging(&bsc_test_log_info);
-
-	struct e1inp_line_ops ops = {
-		.cfg = {
-			.ipa = {
-				.addr	= "0.0.0.0",
-				.role	= E1INP_LINE_R_BSC,
-			},
-		},
-		.sign_link_up	= sign_link_up,
-		.sign_link_down	= sign_link_down,
-		.sign_link	= sign_link,
-	};
-
-#define LINENR 0
-
-	line = e1inp_line_create(LINENR, "hsl");
-	if (line == NULL) {
-		LOGP(DBSCTEST, LOGL_ERROR, "problem creating E1 line\n");
-		exit(EXIT_FAILURE);
-	}
-
-	e1inp_line_bind_ops(line, &ops);
-
-	/*
-	 * Depending if this is a real or virtual E1 lines:
-	 * - real (ISDN): create signal link for OML and RSL before line up.
-	 * - vitual (INET): we create it in signal_link_up(...) callback.
-	 *
-	 * The signal link is created via e1inp_sign_link_create(...)
-	 *
-	 * See e1_reconfig_trx and e1_reconfig_bts in libbsc/e1_config.c,
-	 * it explains how this is done with ISDN.
-	 */
-
-	if (e1inp_line_update(line) < 0) {
-		LOGP(DBSCTEST, LOGL_ERROR, "problem creating E1 line\n");
-		exit(EXIT_FAILURE);
-	}
-
-	LOGP(DBSCTEST, LOGL_NOTICE, "entering main loop\n");
-
-	while (1) {
-		osmo_select_main(0);
-	}
-	return 0;
-}
diff --git a/tests/e1inp_hsl_bts_test.c b/tests/e1inp_hsl_bts_test.c
deleted file mode 100644
index 18a06fe..0000000
--- a/tests/e1inp_hsl_bts_test.c
+++ /dev/null
@@ -1,278 +0,0 @@
-#include <stdio.h>
-#include <osmocom/core/talloc.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <osmocom/abis/abis.h>
-#include <osmocom/abis/e1_input.h>
-#include <osmocom/core/logging.h>
-#include <osmocom/core/application.h>
-#include <osmocom/abis/ipaccess.h>
-#include <osmocom/gsm/protocol/gsm_12_21.h>
-
-static void *tall_test;
-static struct e1inp_sign_link *oml_sign_link, *rsl_sign_link;
-
-#define DBTSTEST 0
-
-struct log_info_cat bts_test_cat[] = {
-	[DBTSTEST] = {
-		.name = "DBTSTEST",
-		.description = "BTS-mode test",
-		.color = "\033[1;35m",
-		.enabled = 1, .loglevel = LOGL_NOTICE,
-	},
-};
-
-const struct log_info bts_test_log_info = {
-	.filter_fn = NULL,
-	.cat = bts_test_cat,
-	.num_cat = ARRAY_SIZE(bts_test_cat),
-};
-
-enum bts_state_machine {
-	BTS_TEST_OML_SIGN_LINK_DOWN	= 0,
-	BTS_TEST_OML_SIGN_LINK_UP,
-	BTS_TEST_OML_WAIT_SW_ACT_ACK,
-};
-
-static struct osmo_fd bts_eventfd;
-static int eventfds[2];
-
-static enum bts_state_machine bts_state = BTS_TEST_OML_SIGN_LINK_DOWN;
-
-static struct e1inp_sign_link *
-sign_link_up(void *unit, struct e1inp_line *line, enum e1inp_sign_type type)
-{
-	struct e1inp_sign_link *sign_link = NULL;
-
-	LOGP(DBTSTEST, LOGL_NOTICE, "OML and RSL link up request received.\n");
-
-	e1inp_ts_config_sign(&line->ts[0], line);
-	sign_link = oml_sign_link =
-		e1inp_sign_link_create(&line->ts[0],
-					E1INP_SIGN_OML, NULL, 255, 0);
-	if (!oml_sign_link) {
-		LOGP(DBTSTEST, LOGL_ERROR, "cannot create OML sign link\n");
-		return NULL;
-	}
-	sign_link = rsl_sign_link =
-		e1inp_sign_link_create(&line->ts[0],
-					E1INP_SIGN_RSL, NULL, 0, 0);
-	if (!rsl_sign_link) {
-		LOGP(DBTSTEST, LOGL_ERROR, "cannot create RSL sign link\n");
-		return NULL;
-	}
-
-	if (sign_link) {
-		LOGP(DBTSTEST, LOGL_NOTICE, "signal link has been set up.\n");
-		/* Now we can send OML messages to the BSC. */
-		bts_state = BTS_TEST_OML_SIGN_LINK_UP;
-	}
-	/* tell GSM 12.21 that we're ready to proceed via our event fd. */
-	unsigned int event_type = 0;
-	if (write(eventfds[1], &event_type, sizeof(unsigned int)) < 0)
-		LOGP(DBTSTEST, LOGL_ERROR, "cannot write to event fd.\n");
-
-	return sign_link;
-}
-
-static void sign_link_down(struct e1inp_line *line)
-{
-	LOGP(DBTSTEST, LOGL_NOTICE, "signal link has been closed\n");
-	if (oml_sign_link)
-		e1inp_sign_link_destroy(oml_sign_link);
-	if (rsl_sign_link)
-		e1inp_sign_link_destroy(rsl_sign_link);
-}
-
-static int abis_nm_rcvmsg_fom(struct msgb *msg)
-{
-	struct abis_om_fom_hdr *foh = msgb_l3(msg);
-	uint8_t mt = foh->msg_type;
-	int ret = 0;
-
-	switch (mt) {
-	case NM_MT_SW_ACT_REQ_ACK:  /* SW activate request ACK from BSC. */
-		LOGP(DBTSTEST, LOGL_NOTICE, "Receive SW Act Req ACK\n");
-		break;
-	default:
-		LOGP(DBTSTEST, LOGL_ERROR, "unknown OML message\n");
-		break;
-	}
-	return ret;
-}
-
-static int abis_nm_rcvmsg(struct msgb *msg)
-{
-	int ret = 0;
-	struct abis_om_hdr *oh = msgb_l2(msg);
-
-	msg->l3h = (unsigned char *)oh + sizeof(*oh);
-	switch (oh->mdisc) {
-	case ABIS_OM_MDISC_FOM:
-		ret = abis_nm_rcvmsg_fom(msg);
-		break;
-	default:
-		LOGP(DBTSTEST, LOGL_ERROR, "unknown OML message\n");
-	break;
-	}
-	return ret;
-}
-
-static int sign_link(struct msgb *msg)
-{
-	int ret = 0;
-	struct e1inp_sign_link *link = msg->dst;
-
-	switch(link->type) {
-	case E1INP_SIGN_OML:
-		LOGP(DBTSTEST, LOGL_NOTICE, "OML message received.\n");
-		ret = abis_nm_rcvmsg(msg);
-		break;
-	case E1INP_SIGN_RSL:
-		LOGP(DBTSTEST, LOGL_NOTICE, "RSL message received.\n");
-		break;
-	default:
-		LOGP(DBTSTEST, LOGL_ERROR, "Unknown signalling message.\n");
-		break;
-	}
-	return ret;
-}
-
-static void fill_om_hdr(struct abis_om_hdr *oh, uint8_t len)
-{
-	oh->mdisc = ABIS_OM_MDISC_FOM;
-	oh->placement = ABIS_OM_PLACEMENT_ONLY;
-	oh->sequence = 0;
-	oh->length = len;
-}
-
-static void fill_om_fom_hdr(struct abis_om_hdr *oh, uint8_t len,
-			    uint8_t msg_type, uint8_t obj_class,
-			    uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr)
-{
-	struct abis_om_fom_hdr *foh = (struct abis_om_fom_hdr *) oh->data;
-
-	fill_om_hdr(oh, len+sizeof(*foh));
-	foh->msg_type = msg_type;
-	foh->obj_class = obj_class;
-	foh->obj_inst.bts_nr = bts_nr;
-	foh->obj_inst.trx_nr = trx_nr;
-	foh->obj_inst.ts_nr = ts_nr;
-}
-
-#define OM_ALLOC_SIZE		1024
-#define OM_HEADROOM_SIZE	128
-
-static struct msgb *nm_msgb_alloc(void)
-{
-        return msgb_alloc_headroom(OM_ALLOC_SIZE, OM_HEADROOM_SIZE, "BTS/test");
-}
-
-static int abis_nm_sw_act_req(struct e1inp_sign_link *sign_link,
-			      uint8_t obj_class,
-			      uint8_t i1, uint8_t i2, uint8_t i3,
-			      uint8_t *attr, int att_len)
-{
-	struct abis_om_hdr *oh;
-	struct msgb *msg = nm_msgb_alloc();
-	uint8_t msgtype = NM_MT_SW_ACT_REQ;
-
-	oh = (struct abis_om_hdr *) msgb_put(msg, ABIS_OM_FOM_HDR_SIZE);
-	fill_om_fom_hdr(oh, att_len, msgtype, obj_class, i1, i2, i3);
-
-	if (attr) {
-		uint8_t *ptr = msgb_put(msg, att_len);
-		memcpy(ptr, attr, att_len);
-	}
-	msg->dst = sign_link;
-	return abis_sendmsg(msg);
-}
-
-static int test_bts_gsm_12_21_cb(struct osmo_fd *ofd, unsigned int what)
-{
-	int ret;
-	unsigned int event_type;
-
-	LOGP(DBTSTEST, LOGL_NOTICE, "event fd callback running\n");
-
-	if (read(ofd->fd, &event_type, sizeof(event_type)) == -1) {
-		LOGP(DBTSTEST, LOGL_ERROR, "problems with event fd\n");
-		return -EINVAL;
-	}
-	switch(bts_state) {
-	case BTS_TEST_OML_SIGN_LINK_DOWN:
-		/* Do nothing until OML link becomes ready. */
-		break;
-	case BTS_TEST_OML_SIGN_LINK_UP:
-		/* OML link is up, send SW ACT REQ. */
-		ret = abis_nm_sw_act_req(oml_sign_link, 0, 0, 0, 0, NULL, 0);
-		bts_state = BTS_TEST_OML_WAIT_SW_ACT_ACK;
-		break;
-	case BTS_TEST_OML_WAIT_SW_ACT_ACK:
-		/* ... things should continue after this. */
-		break;
-	}
-	return 0;
-}
-
-int main(void)
-{
-	struct hsl_unit bts_dev_info = {
-		.swversion	= 0xc0,
-		.serno		= 0x0123456789ABCDEF,
-	};
-	struct e1inp_line *line;
-
-	tall_test = talloc_named_const(NULL, 1, "e1inp_test");
-	libosmo_abis_init(tall_test);
-
-	osmo_init_logging(&bts_test_log_info);
-
-	struct e1inp_line_ops ops = {
-		.cfg = {
-			.ipa = {
-				.role	= E1INP_LINE_R_BTS,
-				.addr	= "127.0.0.1",
-				.dev	= &bts_dev_info,
-			},
-		},
-		.sign_link_up	= sign_link_up,
-		.sign_link_down	= sign_link_down,
-		.sign_link	= sign_link,
-	};
-
-#define LINENR 0
-
-	line = e1inp_line_create(LINENR, "hsl");
-	if (line == NULL) {
-		LOGP(DBTSTEST, LOGL_ERROR, "problem enabling E1 line\n");
-		exit(EXIT_FAILURE);
-	}
-	e1inp_line_bind_ops(line, &ops);
-
-	if (e1inp_line_update(line) < 0) {
-		LOGP(DBTSTEST, LOGL_ERROR, "problem enabling E1 line\n");
-		exit(EXIT_FAILURE);
-	}
-
-	LOGP(DBTSTEST, LOGL_NOTICE, "entering main loop\n");
-
-	if (pipe(eventfds) < 0) {
-		LOGP(DBTSTEST, LOGL_ERROR, "cannot create pipe fds\n");
-		exit(EXIT_FAILURE);
-	}
-	bts_eventfd.fd = eventfds[0];
-	bts_eventfd.cb = test_bts_gsm_12_21_cb;
-	bts_eventfd.when = BSC_FD_READ;
-	if (osmo_fd_register(&bts_eventfd) < 0) {
-		LOGP(DBTSTEST, LOGL_ERROR, "could not register event fd\n");
-		exit(EXIT_FAILURE);
-	}
-
-	while (1) {
-		osmo_select_main(0);
-	}
-	return 0;
-}
