Index: openbsc/Makefile.am
===================================================================
--- openbsc/Makefile.am (revision 13e10daa330ea2b699c9aa9d14b3adbd01111fd6)
+++ openbsc/Makefile.am (revision 5e6f52f15ac337599dd7f0971e906da8c162f219)
@@ -5,5 +5,5 @@
 
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = openbsc.pc
+pkgconfig_DATA = openbsc.pc liblaf0rge1.pc libsccp.pc
 
 #dist-hook:
Index: openbsc/configure.in
===================================================================
--- openbsc/configure.in (revision ac96770ad7160323e2445859e128175d28f49295)
+++ openbsc/configure.in (revision 5e6f52f15ac337599dd7f0971e906da8c162f219)
@@ -39,4 +39,6 @@
 AC_OUTPUT(
     openbsc.pc
+    liblaf0rge1.pc
+    libsccp.pc
     include/openbsc/Makefile
     include/vty/Makefile
Index: openbsc/include/openbsc/Makefile.am
===================================================================
--- openbsc/include/openbsc/Makefile.am (revision ffa55a4e8783419f60932ef2f9e872293cf932b9)
+++ openbsc/include/openbsc/Makefile.am (revision 1fdbf40e8a7ca777ea6ca5c4dd70584a3fc75ed3)
@@ -1,8 +1,15 @@
-noinst_HEADERS = abis_nm.h abis_rsl.h debug.h db.h gsm_04_08.h gsm_data.h \
-		 gsm_subscriber.h linuxlist.h msgb.h select.h tlv.h gsm_04_11.h \
+noinst_HEADERS = abis_nm.h abis_rsl.h db.h gsm_04_08.h gsm_data.h \
+		 gsm_subscriber.h gsm_04_11.h \
 		 timer.h misdn.h chan_alloc.h telnet_interface.h paging.h \
-		 subchan_demux.h trau_frame.h e1_input.h trau_mux.h signal.h \
+		 subchan_demux.h trau_frame.h e1_input.h trau_mux.h \
 		 gsm_utils.h ipaccess.h rs232.h openbscdefines.h rtp_proxy.h \
-		 bsc_rll.h mncc.h talloc.h transaction.h ussd.h gsm_04_80.h \
+		 bsc_rll.h mncc.h transaction.h ussd.h gsm_04_80.h \
 		 silent_call.h mgcp.h meas_rep.h bitvec.h rest_octets.h \
 		 system_information.h handover.h statistics.h
+
+laforge_HEADERS = signal.h linuxlist.h timer.h talloc.h msgb.h select.h tlv.h \
+		  debug.h
+laforgedir= $(includedir)/laf0rge1
+
+openbsc_HEADERS = gsm_04_08.h meas_rep.h
+openbscdir = $(includedir)/openbsc
Index: openbsc/include/openbsc/ipaccess.h
===================================================================
--- openbsc/include/openbsc/ipaccess.h (revision 0183edd18c0b45b200b711e4b8ec9f185fa4e1a1)
+++ openbsc/include/openbsc/ipaccess.h (revision d3d5be1cde518281ad9f594a3cac33fabacf608d)
@@ -49,4 +49,9 @@
 struct msgb *ipaccess_read_msg(struct bsc_fd *bfd, int *error);
 void ipaccess_prepend_header(struct msgb *msg, int proto);
+int ipaccess_send_id_ack(int fd);
+int ipaccess_send_id_req(int fd);
+
+int ipaccess_idtag_parse(struct tlv_parsed *dec, unsigned char *buf, int len);
+
 
 /*
Index: openbsc/include/openbsc/msgb.h
===================================================================
--- openbsc/include/openbsc/msgb.h (revision cbbd49807f3f66f4a7ff6be03b5e63a95650a1c8)
+++ openbsc/include/openbsc/msgb.h (revision 6d89dac7216b4ce727dccc29ee3ee67c8edfa135)
@@ -21,5 +21,6 @@
  */
 
-#include <openbsc/linuxlist.h>
+#include <sys/types.h>
+#include "linuxlist.h"
 
 struct bts_link;
Index: openbsc/include/openbsc/select.h
===================================================================
--- openbsc/include/openbsc/select.h (revision 13e10daa330ea2b699c9aa9d14b3adbd01111fd6)
+++ openbsc/include/openbsc/select.h (revision 245d17bd887809cb595e80b6f342599827bea603)
@@ -2,5 +2,5 @@
 #define _BSC_SELECT_H
 
-#include <openbsc/linuxlist.h>
+#include "linuxlist.h"
 
 #define BSC_FD_READ	0x0001
Index: openbsc/include/openbsc/telnet_interface.h
===================================================================
--- openbsc/include/openbsc/telnet_interface.h (revision b61e3b21580afc6381a6c72618d51697c7ce9771)
+++ openbsc/include/openbsc/telnet_interface.h (revision f5b36cac6b08a5c82f7e9b0facea2c1afba0fefb)
@@ -28,7 +28,4 @@
 #include <vty/vty.h>
 
-#define TELNET_COMMAND_48	1
-#define TELNET_COMMAND_11	2
-
 struct telnet_connection {
 	struct llist_head entry;
Index: openbsc/include/openbsc/tlv.h
===================================================================
--- openbsc/include/openbsc/tlv.h (revision 5078148829920b7e7b8269b5a6420c0a999cc877)
+++ openbsc/include/openbsc/tlv.h (revision 701d175653c037b8cab4b02a3092a6df79e2fdd2)
@@ -23,4 +23,5 @@
 #define TLV16_GROSS_LEN(x)	((2*x)+2)
 #define TL16V_GROSS_LEN(x)	(x+3)
+#define L16TV_GROSS_LEN(x)	(x+3)
 
 #define TVLV_MAX_ONEBYTE	0x7f
@@ -104,4 +105,16 @@
 	u_int8_t *buf = msgb_put(msg, TVLV_GROSS_LEN(len));
 	return tvlv_put(buf, tag, len, val);
+}
+
+static inline u_int8_t *msgb_l16tv_put(struct msgb *msg, u_int16_t len, u_int8_t tag,
+                                       const u_int8_t *val)
+{
+	u_int8_t *buf = msgb_put(msg, L16TV_GROSS_LEN(len));
+
+	*buf++ = len >> 8;
+	*buf++ = len & 0xff;
+	*buf++ = tag;
+	memcpy(buf, val, len);
+	return buf + len;
 }
 
Index: openbsc/include/sccp/Makefile.am
===================================================================
--- openbsc/include/sccp/Makefile.am (revision ac96770ad7160323e2445859e128175d28f49295)
+++ openbsc/include/sccp/Makefile.am (revision 5e6f52f15ac337599dd7f0971e906da8c162f219)
@@ -1,1 +1,2 @@
-noinst_HEADERS = sccp_types.h sccp.h
+sccp_HEADERS = sccp_types.h sccp.h
+sccpdir = $(includedir)/sccp
Index: openbsc/include/sccp/sccp.h
===================================================================
--- openbsc/include/sccp/sccp.h (revision 82da7fcf62e2f06cca5fe3a6edfdbbbc6bd668c2)
+++ openbsc/include/sccp/sccp.h (revision 7184c2d7d2a97b837362a300727adbe45315ebfc)
@@ -28,9 +28,9 @@
 
 #include <sys/socket.h>
-
-#include <openbsc/msgb.h>
+#include <sys/types.h>
 
 #include "sccp_types.h"
 
+struct msgb;
 struct sccp_system;
 
Index: openbsc/liblaf0rge1.pc.in
===================================================================
--- openbsc/liblaf0rge1.pc.in (revision 6b46c474e503a7ecd740e2866e07b0ba2a00842c)
+++ openbsc/liblaf0rge1.pc.in (revision 6b46c474e503a7ecd740e2866e07b0ba2a00842c)
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: LaF0rge Lib
+Description: C Utility Library
+Version: @VERSION@
+Libs: -L${libdir} -llaf0rge1
+Cflags: -I${includedir}/
+
Index: openbsc/libsccp.pc.in
===================================================================
--- openbsc/libsccp.pc.in (revision 5e6f52f15ac337599dd7f0971e906da8c162f219)
+++ openbsc/libsccp.pc.in (revision 5e6f52f15ac337599dd7f0971e906da8c162f219)
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: OpenBSC SCCP Lib
+Description: OpenBSC SCCP Lib
+Version: @VERSION@
+Libs: -L${libdir} -lsccp
+Cflags: -I${includedir}/
Index: openbsc/openbsc.pc.in
===================================================================
--- openbsc/openbsc.pc.in (revision 13e10daa330ea2b699c9aa9d14b3adbd01111fd6)
+++ openbsc/openbsc.pc.in (revision 1fdbf40e8a7ca777ea6ca5c4dd70584a3fc75ed3)
@@ -2,5 +2,5 @@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
-includedir=@includedir@/openbsc-1.0
+includedir=@includedir@/
 
 Name: OpenBSC
Index: openbsc/src/Makefile.am
===================================================================
--- openbsc/src/Makefile.am (revision e0955029a141c52921b408d12b23469bcd919b81)
+++ openbsc/src/Makefile.am (revision c64d9f720165bbc09835b80ef34f65475889a68d)
@@ -4,12 +4,17 @@
 sbin_PROGRAMS = bsc_hack bs11_config ipaccess-find ipaccess-config \
                 isdnsync bsc_mgcp ipaccess-proxy
-noinst_LIBRARIES = libbsc.a libmsc.a libvty.a libsccp.a
+noinst_LIBRARIES = libbsc.a libmsc.a libvty.a
 noinst_HEADERS = vty/cardshell.h
 
+bscdir = $(libdir)
+bsc_LIBRARIES = liblaf0rge1.a libsccp.a
+
+liblaf0rge1_a_SOURCES = msgb.c timer.c talloc.c select.c signal.c debug.c
+
 libbsc_a_SOURCES = abis_rsl.c abis_nm.c gsm_data.c gsm_04_08_utils.c \
-		msgb.c select.c chan_alloc.c timer.c debug.c \
+		chan_alloc.c \
 		gsm_subscriber_base.c subchan_demux.c bsc_rll.c transaction.c \
 		trau_frame.c trau_mux.c paging.c e1_config.c e1_input.c tlv_parser.c \
-		input/misdn.c input/ipaccess.c signal.c gsm_utils.c talloc.c \
+		input/misdn.c input/ipaccess.c signal.c gsm_utils.c \
 		talloc_ctx.c system_information.c bitvec.c rest_octets.c \
 		rtp_proxy.c statistics.c bts_siemens_bs11.c bts_ipaccess_nanobts.c \
@@ -26,5 +31,5 @@
 
 bsc_hack_SOURCES = bsc_hack.c bsc_init.c vty_interface.c vty_interface_layer3.c
-bsc_hack_LDADD = libmsc.a libbsc.a libmsc.a libvty.a -ldl -ldbi $(LIBCRYPT)
+bsc_hack_LDADD = libmsc.a libbsc.a libmsc.a libvty.a liblaf0rge1.a -ldl -ldbi $(LIBCRYPT)
 
 bs11_config_SOURCES = bs11_config.c abis_nm.c gsm_data.c msgb.c debug.c \
@@ -35,10 +40,10 @@
 
 ipaccess_config_SOURCES = ipaccess/ipaccess-config.c ipaccess/ipaccess-firmware.c
-ipaccess_config_LDADD = libbsc.a libmsc.a libbsc.a libvty.a -ldl -ldbi $(LIBCRYPT)
+ipaccess_config_LDADD = libbsc.a libmsc.a libbsc.a libvty.a liblaf0rge1.a -ldl -ldbi $(LIBCRYPT)
 
 isdnsync_SOURCES = isdnsync.c
 
 bsc_mgcp_SOURCES = mgcp/mgcp_main.c mgcp/mgcp_protocol.c msgb.c talloc.c debug.c select.c timer.c telnet_interface.c
-bsc_mgcp_LDADD = libvty.a
+bsc_mgcp_LDADD = libvty.a liblaf0rge1.a
 
 ipaccess_proxy_SOURCES = ipaccess/ipaccess-proxy.c msgb.c select.c talloc.c debug.c timer.c
Index: openbsc/src/bsc_init.c
===================================================================
--- openbsc/src/bsc_init.c (revision 7de67960e786fbaecd2348fdbcfb660150959f8f)
+++ openbsc/src/bsc_init.c (revision fb0b6fcaeacbc49ef8473f62a373cf77afb1502c)
@@ -803,6 +803,8 @@
 		break;
 	case GSM_BAND_900:
-		if (bts->c0->arfcn < 1 || bts->c0->arfcn > 124) {
-			LOGP(DNM, LOGL_ERROR, "GSM900 channel must be between 1-124.\n");
+		if (bts->c0->arfcn < 1 ||
+		   (bts->c0->arfcn > 124 && bts->c0->arfcn < 955) ||
+		    bts->c0->arfcn > 1023)  {
+			LOGP(DNM, LOGL_ERROR, "GSM900 channel must be between 1-124, 955-1023.\n");
 			return -EINVAL;
 		}
Index: openbsc/src/input/ipaccess.c
===================================================================
--- openbsc/src/input/ipaccess.c (revision 7971d3d28199c9927ae34364ff5e35506d4dde90)
+++ openbsc/src/input/ipaccess.c (revision 4d2d95b35addba99a7927041554d50ed7452fd7c)
@@ -90,5 +90,5 @@
 }
 
-static int ipac_idtag_parse(struct tlv_parsed *dec, unsigned char *buf, int len)
+int ipaccess_idtag_parse(struct tlv_parsed *dec, unsigned char *buf, int len)
 {
 	u_int8_t t_len;
@@ -165,4 +165,15 @@
 }
 
+/* send the id ack */
+int ipaccess_send_id_ack(int fd)
+{
+	return write(fd, id_ack, sizeof(id_ack));
+}
+
+int ipaccess_send_id_req(int fd)
+{
+	return write(fd, id_req, sizeof(id_req));
+}
+
 /* base handling of the ip.access protocol */
 int ipaccess_rcvmsg_base(struct msgb *msg,
@@ -181,5 +192,5 @@
 	case IPAC_MSGT_ID_ACK:
 		DEBUGP(DMI, "ID_ACK? -> ACK!\n");
-		ret = write(bfd->fd, id_ack, sizeof(id_ack));
+		ret = ipaccess_send_id_ack(bfd->fd);
 		break;
 	}
@@ -202,5 +213,5 @@
 		DEBUGP(DMI, "ID_RESP ");
 		/* parse tags, search for Unit ID */
-		ipac_idtag_parse(&tlvp, (u_int8_t *)msg->l2h + 2,
+		ipaccess_idtag_parse(&tlvp, (u_int8_t *)msg->l2h + 2,
 				 msgb_l2len(msg)-2);
 		DEBUGP(DMI, "\n");
@@ -531,5 +542,5 @@
 
 	/* Request ID. FIXME: request LOCATION, HW/SW VErsion, Unit Name, Serno */
-	ret = write(bfd->fd, id_req, sizeof(id_req));
+	ret = ipaccess_send_id_req(bfd->fd);
 
         return ret;
@@ -588,4 +599,9 @@
 	//bfd->data = line;
 
+	if (bfd->fd < 0) {
+		LOGP(DINP, LOGL_ERROR, "could not create TCP socket.\n");
+		return -EIO;
+	}
+
 	memset(&addr, 0, sizeof(addr));
 	addr.sin_family = AF_INET;
@@ -599,4 +615,5 @@
 		LOGP(DINP, LOGL_ERROR, "could not bind l2 socket %s\n",
 			strerror(errno));
+		close(bfd->fd);
 		return -EIO;
 	}
@@ -605,4 +622,5 @@
 	if (ret < 0) {
 		perror("listen");
+		close(bfd->fd);
 		return ret;
 	}
@@ -611,4 +629,5 @@
 	if (ret < 0) {
 		perror("register_listen_fd");
+		close(bfd->fd);
 		return ret;
 	}
@@ -629,4 +648,9 @@
 	bfd->priv_nr = 1;
 
+	if (bfd->fd < 0) {
+		LOGP(DINP, LOGL_ERROR, "could not create TCP socket.\n");
+		return -EIO;
+	}
+
 	setsockopt(bfd->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
 
Index: openbsc/src/sccp/sccp.c
===================================================================
--- openbsc/src/sccp/sccp.c (revision e2c5028dc4ca8b3f9f4846b658a9b80ec3e70f4d)
+++ openbsc/src/sccp/sccp.c (revision 9442c1b9bad3426ece07edc7fa2dca7464fc302a)
@@ -25,9 +25,10 @@
 #include <string.h>
 
-#include <sccp/sccp.h>
-
+#include <openbsc/msgb.h>
 #include <openbsc/debug.h>
 #include <openbsc/talloc.h>
-#include <openbsc/linuxlist.h>
+
+#include <sccp/sccp.h>
+
 
 static void *tall_sccp_ctx;
Index: openbsc/tests/db/Makefile.am
===================================================================
--- openbsc/tests/db/Makefile.am (revision 93d4394d1d0e14a71e6cead8a895907c92cf7784)
+++ openbsc/tests/db/Makefile.am (revision b19dc286aafc8f803534d2dcb164475d5fba6f37)
@@ -5,4 +5,4 @@
 
 db_test_SOURCES = db_test.c
-db_test_LDADD = $(top_builddir)/src/libbsc.a $(top_builddir)/src/libmsc.a $(top_builddir)/src/libbsc.a -ldl -ldbi
+db_test_LDADD = $(top_builddir)/src/libbsc.a $(top_builddir)/src/libmsc.a $(top_builddir)/src/libbsc.a $(top_builddir)/src/liblaf0rge1.a -ldl -ldbi
 
Index: openbsc/tests/gsm0408/Makefile.am
===================================================================
--- openbsc/tests/gsm0408/Makefile.am (revision 1494a768c14295a63cbf59f729dcf91a8b4d22ba)
+++ openbsc/tests/gsm0408/Makefile.am (revision b19dc286aafc8f803534d2dcb164475d5fba6f37)
@@ -3,3 +3,3 @@
 
 gsm0408_test_SOURCES = gsm0408_test.c
-gsm0408_test_LDADD = $(top_builddir)/src/libbsc.a $(top_builddir)/src/libmsc.a $(top_builddir)/src/libbsc.a -ldbi
+gsm0408_test_LDADD = $(top_builddir)/src/libbsc.a $(top_builddir)/src/libmsc.a $(top_builddir)/src/libbsc.a $(top_builddir)/src/liblaf0rge1.a -ldbi
Index: openbsc/tests/sccp/Makefile.am
===================================================================
--- openbsc/tests/sccp/Makefile.am (revision ac96770ad7160323e2445859e128175d28f49295)
+++ openbsc/tests/sccp/Makefile.am (revision b19dc286aafc8f803534d2dcb164475d5fba6f37)
@@ -5,4 +5,4 @@
 
 sccp_test_SOURCES = sccp_test.c
-sccp_test_LDADD = $(top_builddir)/src/libsccp.a $(top_builddir)/src/libbsc.a
+sccp_test_LDADD = $(top_builddir)/src/libsccp.a $(top_builddir)/src/libbsc.a $(top_builddir)/src/liblaf0rge1.a
 
Index: openbsc/tests/sccp/sccp_test.c
===================================================================
--- openbsc/tests/sccp/sccp_test.c (revision 6ae657228c779e24ff036cdb72518e676025d606)
+++ openbsc/tests/sccp/sccp_test.c (revision 7184c2d7d2a97b837362a300727adbe45315ebfc)
@@ -27,7 +27,9 @@
 #include <arpa/inet.h>
 
-#include <sccp/sccp.h>
 #include <openbsc/gsm_data.h>
 #include <openbsc/debug.h>
+#include <openbsc/msgb.h>
+
+#include <sccp/sccp.h>
 
 #define MIN(x, y) ((x) < (y) ? (x) : (y))
Index: openbsc/tests/sms/Makefile.am
===================================================================
--- openbsc/tests/sms/Makefile.am (revision 93d4394d1d0e14a71e6cead8a895907c92cf7784)
+++ openbsc/tests/sms/Makefile.am (revision b19dc286aafc8f803534d2dcb164475d5fba6f37)
@@ -3,3 +3,3 @@
 
 sms_test_SOURCES = sms_test.c
-sms_test_LDADD = $(top_builddir)/src/libmsc.a $(top_builddir)/src/libbsc.a -ldl -ldbi
+sms_test_LDADD = $(top_builddir)/src/libmsc.a $(top_builddir)/src/libbsc.a $(top_builddir)/src/liblaf0rge1.a -ldl -ldbi
