hack to write TS2 frames to a file 

diff --git a/src/misdn.c b/src/misdn.c
index 5e55ec7..fae6b0d 100644
--- a/src/misdn.c
+++ b/src/misdn.c
@@ -25,6 +25,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
+#include <sys/fcntl.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
@@ -59,6 +60,8 @@
 
 	void (*cb)(int event, struct gsm_bts *bts);
 	struct bsc_fd fd[NUM_E1_TS];
+
+	int ts2_fd;
 };
 
 /* FIXME: this needs to go */
@@ -246,10 +249,56 @@
 	return ret;
 }
 
+#define TSX_ALLOC_SIZE 4096
+
+/* FIXME: read from a B channel TS */
 static int handle_tsX_read(struct bsc_fd *bfd)
 {
-	/* FIXME: read from a B channel TS */
-	return -1;
+	struct mi_e1_handle *e1h = bfd->data;
+	struct msgb *msg = msgb_alloc(TSX_ALLOC_SIZE);
+	struct mISDNhead *hh;
+	int ret;
+
+	if (!msg)
+		return -ENOMEM;
+
+	hh = (struct mISDNhead *) msg->data;
+
+	/* FIXME: Map TEI/SAPI to TRX */
+	msg->trx = e1h->bts->c0;
+
+	ret = recv(bfd->fd, msg->data, TSX_ALLOC_SIZE, 0);
+	if (ret < 0) {
+		fprintf(stderr, "recvfrom error  %s\n", strerror(errno));
+		return ret;
+	}
+
+	msgb_put(msg, ret);
+
+	DEBUGP(DMIB, "<= BCHAN len = %d, prim(0x%x) id(0x%x)\n", ret, hh->prim, hh->id);
+
+	switch (hh->prim) {
+	case PH_CONTROL_IND:
+		DEBUGP(DMIB, "got PH_CONTROL_IND\n");
+		break;
+	case PH_DATA_IND:
+		DEBUGP(DMIB, "got PH_DATA_IND\n");
+
+		msg->l2h = msg->data + MISDN_HEADER_LEN;
+		
+		fprintf(stdout, "BCHAN RX: ");
+		hexdump(msgb_l2(msg), ret - MISDN_HEADER_LEN);
+		if (!e1h->ts2_fd)
+			e1h->ts2_fd = open("/tmp/ts2.dump", O_WRONLY|O_APPEND|O_CREAT, 0660);
+		
+		write(e1h->ts2_fd, msgb_l2(msg), ret - MISDN_HEADER_LEN);
+
+		break;
+	default:
+		DEBUGP(DMIB, "got unexpected 0x%x prim\n", hh->prim);
+		break;
+	}
+	return ret;
 }
 
 static int handle_tsX_write(struct bsc_fd *bfd)
@@ -304,6 +353,25 @@
 	return 0;
 }
 
+static int activate_bchan(struct mi_e1_handle *e1h, int ts)
+{
+	struct mISDNhead hh;
+	int ret;
+	struct bsc_fd *bfd = &e1h->fd[ts-1];
+
+	fprintf(stdout, "activate bchan\n");
+	hh.prim = PH_ACTIVATE_REQ;
+	hh.id = MISDN_ID_ANY;
+	ret = sendto(bfd->fd, &hh, sizeof(hh), 0, NULL, 0);
+	if (ret < 0) {
+		fprintf(stdout, "could not send ACTIVATE_RQ %s\n",
+			strerror(errno));
+		return 0;
+	}
+
+	return ret;
+}
+
 static int mi_e1_setup(struct mi_e1_handle *e1h)
 {
 	int ts, sk, ret, cnt;
@@ -356,7 +424,6 @@
 		} else
 			bfd->fd = socket(PF_ISDN, SOCK_DGRAM, ISDN_P_B_RAW);
 
-
 		if (bfd->fd < 0) {
 			fprintf(stderr, "could not open socket %s\n",
 				strerror(errno));
@@ -380,6 +447,11 @@
 			return -EIO;
 		}
 
+		if (ts == 2) {
+			bfd->when = BSC_FD_READ;
+			activate_bchan(e1h, ts);
+		}
+
 		ret = bsc_register_fd(bfd);
 		if (ret < 0) {
 			fprintf(stderr, "could not register FD: %s\n",