diff --git a/src/gsm/Makefile.am b/src/gsm/Makefile.am
index 7489327..88b2d9a 100644
--- a/src/gsm/Makefile.am
+++ b/src/gsm/Makefile.am
@@ -9,6 +9,7 @@
 
 libosmogsm_la_SOURCES = a5.c rxlev_stat.c tlv_parser.c comp128.c gsm_utils.c \
                         rsl.c gsm48.c gsm48_ie.c gsm0808.c sysinfo.c \
-			gprs_cipher_core.c gsm0480.c abis_nm.c gsm0502.c
+			gprs_cipher_core.c gsm0480.c abis_nm.c gsm0502.c \
+			lapdm.c
 libosmogsm_la_LDFLAGS = -version-info $(LIBVERSION)
 libosmogsm_la_LIBADD = $(top_builddir)/src/libosmocore.la
diff --git a/src/gsm/lapdm.c b/src/gsm/lapdm.c
new file mode 100644
index 0000000..b804a92
--- /dev/null
+++ b/src/gsm/lapdm.c
@@ -0,0 +1,2510 @@
+/* GSM LAPDm (TS 04.06) implementation */
+
+/* (C) 2010-2011 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2010 by Andreas Eversberg <jolly@eversberg.eu>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+/* Notes on Buffering: rcv_buffer, tx_queue, tx_hist, send_buffer, send_queue
+ *
+ * RX data is stored in the rcv_buffer (pointer). If the message is complete, it
+ * is removed from rcv_buffer pointer and forwarded to L3. If the RX data is
+ * received while there is an incomplete rcv_buffer, it is appended to it.
+ *
+ * TX data is stored in the send_queue first. When transmitting a frame,
+ * the first message in the send_queue is moved to the send_buffer. There it
+ * resides until all fragments are acknowledged. Fragments to be sent by I
+ * frames are stored in the tx_hist buffer for resend, if required. Also the
+ * current fragment is copied into the tx_queue. There it resides until it is
+ * forwarded to layer 1.
+ *
+ * In case we have SAPI 0, we only have a window size of 1, so the unack-
+ * nowledged message resides always in the send_buffer. In case of a suspend,
+ * it can be written back to the first position of the send_queue.
+ *
+ * The layer 1 normally sends a PH-READY-TO-SEND. But because we use
+ * asynchronous transfer between layer 1 and layer 2 (serial link), we must
+ * send a frame before layer 1 reaches the right timeslot to send it. So we
+ * move the tx_queue to layer 1 when there is not already a pending frame, and
+ * wait until acknowledge after the frame has been sent. If we receive an
+ * acknowledge, we can send the next frame from the buffer, if any.
+ *
+ * The moving of tx_queue to layer 1 may also trigger T200, if desired. Also it
+ * will trigger next I frame, if possible.
+ *
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+#include <arpa/inet.h>
+
+#include <osmocom/core/logging.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/utils.h>
+
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/gsm/rsl.h>
+#include <osmocom/gsm/prim.h>
+#include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/gsm/lapdm.h>
+
+#include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/gsm/protocol/gsm_08_58.h>
+
+/* TS 04.06 Figure 4 / Section 3.2 */
+#define LAPDm_LPD_NORMAL  0
+#define LAPDm_LPD_SMSCB	  1
+#define LAPDm_SAPI_NORMAL 0
+#define LAPDm_SAPI_SMS	  3
+#define LAPDm_ADDR(lpd, sapi, cr) ((((lpd) & 0x3) << 5) | (((sapi) & 0x7) << 2) | (((cr) & 0x1) << 1) | 0x1)
+
+#define LAPDm_ADDR_SAPI(addr) (((addr) >> 2) & 0x7)
+#define LAPDm_ADDR_CR(addr) (((addr) >> 1) & 0x1)
+#define LAPDm_ADDR_EA(addr) ((addr) & 0x1)
+
+/* TS 04.06 Table 3 / Section 3.4.3 */
+#define LAPDm_CTRL_I(nr, ns, p)	((((nr) & 0x7) << 5) | (((p) & 0x1) << 4) | (((ns) & 0x7) << 1))
+#define LAPDm_CTRL_S(nr, s, p)	((((nr) & 0x7) << 5) | (((p) & 0x1) << 4) | (((s) & 0x3) << 2) | 0x1)
+#define LAPDm_CTRL_U(u, p)	((((u) & 0x1c) << (5-2)) | (((p) & 0x1) << 4) | (((u) & 0x3) << 2) | 0x3)
+
+#define LAPDm_CTRL_is_I(ctrl)	(((ctrl) & 0x1) == 0)
+#define LAPDm_CTRL_is_S(ctrl)	(((ctrl) & 0x3) == 1)
+#define LAPDm_CTRL_is_U(ctrl)	(((ctrl) & 0x3) == 3)
+
+#define LAPDm_CTRL_U_BITS(ctrl)	((((ctrl) & 0xC) >> 2) | ((ctrl) & 0xE0) >> 3)
+#define LAPDm_CTRL_PF_BIT(ctrl)	(((ctrl) >> 4) & 0x1)
+
+#define LAPDm_CTRL_S_BITS(ctrl)	(((ctrl) & 0xC) >> 2)
+
+#define LAPDm_CTRL_I_Ns(ctrl)	(((ctrl) & 0xE) >> 1)
+#define LAPDm_CTRL_Nr(ctrl)	(((ctrl) & 0xE0) >> 5)
+
+/* TS 04.06 Table 4 / Section 3.8.1 */
+#define LAPDm_U_SABM	0x7
+#define LAPDm_U_DM	0x3
+#define LAPDm_U_UI	0x0
+#define LAPDm_U_DISC	0x8
+#define LAPDm_U_UA	0xC
+
+#define LAPDm_S_RR	0x0
+#define LAPDm_S_RNR	0x1
+#define LAPDm_S_REJ	0x2
+
+#define LAPDm_LEN(len)	((len << 2) | 0x1)
+#define LAPDm_MORE	0x2
+
+/* TS 04.06 Section 5.8.3 */
+#define N201_AB_SACCH		18
+#define N201_AB_SDCCH		20
+#define N201_AB_FACCH		20
+#define N201_Bbis		23
+#define N201_Bter_SACCH		21
+#define N201_Bter_SDCCH		23
+#define N201_Bter_FACCH		23
+#define N201_B4			19
+
+/* 5.8.2.1 N200 during establish and release */
+#define N200_EST_REL		5
+/* 5.8.2.1 N200 during timer recovery state */
+#define N200_TR_SACCH		5
+#define N200_TR_SDCCH		23
+#define N200_TR_FACCH_FR	34
+#define N200_TR_EFACCH_FR	48
+#define N200_TR_FACCH_HR	29
+/* FIXME: this depends on chan type */
+#define N200	N200_TR_SACCH
+
+#define CR_MS2BS_CMD	0
+#define CR_MS2BS_RESP	1
+#define CR_BS2MS_CMD	1
+#define CR_BS2MS_RESP	0
+
+/* Set T200 to 1 Second (OpenBTS uses 900ms) */
+#define T200	1, 0
+
+/* k value for each SAPI */
+static uint8_t k_sapi[] = {1, 1, 1, 1, 1, 1, 1, 1};
+
+enum lapdm_format {
+	LAPDm_FMT_A,
+	LAPDm_FMT_B,
+	LAPDm_FMT_Bbis,
+	LAPDm_FMT_Bter,
+	LAPDm_FMT_B4,
+};
+
+static void lapdm_t200_cb(void *data);
+static int rslms_send_i(struct lapdm_msg_ctx *mctx, int line);
+
+/* UTILITY FUNCTIONS */
+
+static inline uint8_t inc_mod8(uint8_t x)
+{
+	return (x + 1) & 7;
+}
+
+static inline uint8_t add_mod8(uint8_t x, uint8_t y)
+{
+	return (x + y) & 7;
+}
+
+static inline uint8_t sub_mod8(uint8_t x, uint8_t y)
+{
+	return (x - y) & 7; /* handle negative results correctly */
+}
+
+static void lapdm_dl_init(struct lapdm_datalink *dl,
+			  struct lapdm_entity *entity)
+{
+	memset(dl, 0, sizeof(*dl));
+	INIT_LLIST_HEAD(&dl->send_queue);
+	INIT_LLIST_HEAD(&dl->tx_queue);
+	dl->state = LAPDm_STATE_IDLE;
+	dl->t200.data = dl;
+	dl->t200.cb = &lapdm_t200_cb;
+	dl->entity = entity;
+}
+
+void lapdm_entity_init(struct lapdm_entity *le, enum lapdm_mode mode)
+{
+	unsigned int i;
+
+	for (i = 0; i < ARRAY_SIZE(le->datalink); i++)
+		lapdm_dl_init(&le->datalink[i], le);
+
+	lapdm_entity_set_mode(le, mode);
+}
+
+void lapdm_channel_init(struct lapdm_channel *lc, enum lapdm_mode mode)
+{
+	lapdm_entity_init(&lc->lapdm_acch, mode);
+	lapdm_entity_init(&lc->lapdm_dcch, mode);
+}
+
+
+static void lapdm_dl_flush_send(struct lapdm_datalink *dl)
+{
+	struct msgb *msg;
+
+	/* Flush send-queue */
+	while ((msg = msgb_dequeue(&dl->send_queue)))
+		msgb_free(msg);
+
+	/* Clear send-buffer */
+	if (dl->send_buffer) {
+		msgb_free(dl->send_buffer);
+		dl->send_buffer = NULL;
+	}
+}
+
+static void lapdm_dl_flush_tx(struct lapdm_datalink *dl)
+{
+	struct msgb *msg;
+	unsigned int i;
+
+	while ((msg = msgb_dequeue(&dl->tx_queue)))
+		msgb_free(msg);
+	for (i = 0; i < 8; i++)
+		dl->tx_length[i] = 0;
+}
+
+void lapdm_entity_exit(struct lapdm_entity *le)
+{
+	unsigned int i;
+	struct lapdm_datalink *dl;
+
+	for (i = 0; i < ARRAY_SIZE(le->datalink); i++) {
+		dl = &le->datalink[i];
+		lapdm_dl_flush_tx(dl);
+		lapdm_dl_flush_send(dl);
+		if (dl->rcv_buffer)
+			msgb_free(dl->rcv_buffer);
+	}
+}
+
+void lapdm_channel_exit(struct lapdm_channel *lc)
+{
+	lapdm_entity_exit(&lc->lapdm_acch);
+	lapdm_entity_exit(&lc->lapdm_dcch);
+}
+
+static void lapdm_dl_newstate(struct lapdm_datalink *dl, uint32_t state)
+{
+	LOGP(DLLAPDM, LOGL_INFO, "new state %s -> %s\n",
+		lapdm_state_names[dl->state], lapdm_state_names[state]);
+	
+	dl->state = state;
+}
+
+static struct lapdm_datalink *datalink_for_sapi(struct lapdm_entity *le, uint8_t sapi)
+{
+	switch (sapi) {
+	case LAPDm_SAPI_NORMAL:
+		return &le->datalink[0];
+	case LAPDm_SAPI_SMS:
+		return &le->datalink[1];
+	default:
+		return NULL;
+	}
+}
+
+/* remove the L2 header from a MSGB */
+static inline unsigned char *msgb_pull_l2h(struct msgb *msg)
+{
+	unsigned char *ret = msgb_pull(msg, msg->l3h - msg->l2h);
+	msg->l2h = NULL;
+	return ret;
+}
+
+/* Append padding (if required) */
+static void lapdm_pad_msgb(struct msgb *msg, uint8_t n201)
+{
+	int pad_len = n201 - msgb_l2len(msg);
+	uint8_t *data;
+
+	if (pad_len < 0) {
+		LOGP(DLLAPDM, LOGL_ERROR,
+		     "cannot pad message that is already too big!\n");
+		return;
+	}
+
+	data = msgb_put(msg, pad_len);
+	memset(data, 0x2B, pad_len);
+}
+
+/* input function that L2 calls when sending messages up to L3 */
+static int rslms_sendmsg(struct msgb *msg, struct lapdm_entity *le)
+{
+	if (!le->l3_cb) {
+		msgb_free(msg);
+		return -EIO;
+	}
+
+	/* call the layer2 message handler that is registered */
+	return le->l3_cb(msg, le, le->l3_ctx);
+}
+
+/* write a frame into the tx queue */
+static int tx_ph_data_enqueue(struct lapdm_datalink *dl, struct msgb *msg,
+				uint8_t chan_nr, uint8_t link_id, uint8_t n201)
+{
+	struct lapdm_entity *le = dl->entity;
+	struct osmo_phsap_prim pp;
+
+	/* if there is a pending message, queue it */
+	if (le->tx_pending || le->flags & LAPDM_ENT_F_POLLING_ONLY) {
+		*msgb_push(msg, 1) = n201;
+		*msgb_push(msg, 1) = link_id;
+		*msgb_push(msg, 1) = chan_nr;
+		msgb_enqueue(&dl->tx_queue, msg);
+		return -EBUSY;
+	}
+
+	osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_DATA,
+			PRIM_OP_REQUEST, msg);
+	pp.u.data.chan_nr = chan_nr;
+	pp.u.data.link_id = link_id;
+
+	/* send the frame now */
+	le->tx_pending = 0; /* disabled flow control */
+	lapdm_pad_msgb(msg, n201);
+
+	return le->l1_prim_cb(&pp.oph, le->l1_ctx);
+}
+
+static struct msgb *tx_dequeue_msgb(struct lapdm_entity *le)
+{
+	struct lapdm_datalink *dl;
+	int last = le->last_tx_dequeue;
+	int i = last, n = ARRAY_SIZE(le->datalink);
+	struct msgb *msg = NULL;
+
+	/* round-robin dequeue */
+	do {
+		/* next */
+		i = (i + 1) % n;
+		dl = &le->datalink[i];
+		if ((msg = msgb_dequeue(&dl->tx_queue)))
+			break;
+	} while (i != last);
+
+	if (msg) {
+		/* Set last dequeue position */
+		le->last_tx_dequeue = i;
+	}
+
+	return msg;
+}
+
+/* dequeue a msg that's pending transmission via L1 and wrap it into
+ * a osmo_phsap_prim */
+int lapdm_phsap_dequeue_prim(struct lapdm_entity *le, struct osmo_phsap_prim *pp)
+{
+	struct msgb *msg;
+	uint8_t n201;
+
+	msg = tx_dequeue_msgb(le);
+	if (!msg)
+		return -ENODEV;
+
+	/* if we have a message, send PH-DATA.req */
+	osmo_prim_init(&pp->oph, SAP_GSM_PH, PRIM_PH_DATA,
+			PRIM_OP_REQUEST, msg);
+
+	/* Pull chan_nr and link_id */
+	pp->u.data.chan_nr = *msg->data;
+	msgb_pull(msg, 1);
+	pp->u.data.link_id = *msg->data;
+	msgb_pull(msg, 1);
+	n201 = *msg->data;
+	msgb_pull(msg, 1);
+
+	/* Pad the frame, we can transmit now */
+	lapdm_pad_msgb(msg, n201);
+
+	return 0;
+}
+
+/* get next frame from the tx queue. because the ms has multiple datalinks,
+ * each datalink's queue is read round-robin.
+ */
+static int l2_ph_data_conf(struct msgb *msg, struct lapdm_entity *le)
+{
+	struct osmo_phsap_prim pp;
+
+	/* we may send again */
+	le->tx_pending = 0;
+
+	/* free confirm message */
+	if (msg)
+		msgb_free(msg);
+
+	if (lapdm_phsap_dequeue_prim(le, &pp) < 0) {
+		/* no message in all queues */
+
+		/* If user didn't request PH-EMPTY_FRAME.req, abort */
+		if (!(le->flags & LAPDM_ENT_F_EMPTY_FRAME))
+			return 0;
+
+		/* otherwise, send PH-EMPTY_FRAME.req */
+		osmo_prim_init(&pp.oph, SAP_GSM_PH,
+				PRIM_PH_EMPTY_FRAME,
+				PRIM_OP_REQUEST, NULL);
+	} else {
+		le->tx_pending = 1;
+	}
+
+	return le->l1_prim_cb(&pp.oph, le->l1_ctx);
+}
+
+/* Create RSLms various RSLms messages */
+static int send_rslms_rll_l3(uint8_t msg_type, struct lapdm_msg_ctx *mctx,
+			     struct msgb *msg)
+{
+	/* Add the RSL + RLL header */
+	rsl_rll_push_l3(msg, msg_type, mctx->chan_nr, mctx->link_id, 1);
+
+	/* send off the RSLms message to L3 */
+	return rslms_sendmsg(msg, mctx->dl->entity);
+}
+
+/* Take a B4 format message from L1 and create RSLms UNIT DATA IND */
+static int send_rslms_rll_l3_ui(struct lapdm_msg_ctx *mctx, struct msgb *msg)
+{
+	uint8_t l3_len = msg->tail - (uint8_t *)msgb_l3(msg);
+	struct abis_rsl_rll_hdr *rllh;
+
+	/* Add the RSL + RLL header */
+	msgb_tv16_push(msg, RSL_IE_L3_INFO, l3_len);
+	msgb_push(msg, 2 + 2);
+	rsl_rll_push_hdr(msg, RSL_MT_UNIT_DATA_IND, mctx->chan_nr,
+		mctx->link_id, 1);
+	rllh = (struct abis_rsl_rll_hdr *)msgb_l2(msg);
+
+	rllh->data[0] = RSL_IE_TIMING_ADVANCE;
+	rllh->data[1] = mctx->ta_ind;
+
+	rllh->data[2] = RSL_IE_MS_POWER;
+	rllh->data[3] = mctx->tx_power_ind;
+	
+	return rslms_sendmsg(msg, mctx->dl->entity);
+}
+
+static int send_rll_simple(uint8_t msg_type, struct lapdm_msg_ctx *mctx)
+{
+	struct msgb *msg;
+
+	msg = rsl_rll_simple(msg_type, mctx->chan_nr, mctx->link_id, 1);
+
+	/* send off the RSLms message to L3 */
+	return rslms_sendmsg(msg, mctx->dl->entity);
+}
+
+static int rsl_rll_error(uint8_t cause, struct lapdm_msg_ctx *mctx)
+{
+	struct msgb *msg;
+
+	LOGP(DLLAPDM, LOGL_NOTICE, "sending MDL-ERROR-IND %d\n", cause);
+	msg = rsl_rll_simple(RSL_MT_ERROR_IND, mctx->chan_nr, mctx->link_id, 1);
+	msg->l2h = msgb_put(msg, sizeof(struct abis_rsl_rll_hdr));
+	msgb_tlv_put(msg, RSL_IE_RLM_CAUSE, 1, &cause);
+	return rslms_sendmsg(msg, mctx->dl->entity);
+}
+
+static int check_length_ind(struct lapdm_msg_ctx *mctx, uint8_t length_ind)
+{
+	if (!(length_ind & 0x01)) {
+		/* G.4.1 If the EL bit is set to "0", an MDL-ERROR-INDICATION
+		 * primitive with cause "frame not implemented" is sent to the
+		 * mobile management entity. */
+		LOGP(DLLAPDM, LOGL_NOTICE,
+			"we don't support multi-octet length\n");
+		rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static int lapdm_send_resend(struct lapdm_datalink *dl)
+{
+	struct msgb *msg = msgb_alloc_headroom(23+10, 10, "LAPDm resend");
+	int length;
+
+	/* Resend SABM/DISC from tx_hist */
+	length = dl->tx_length[0];
+	msg->l2h = msgb_put(msg, length);
+	memcpy(msg->l2h, dl->tx_hist[dl->V_send], length);
+
+	return tx_ph_data_enqueue(dl, msg, dl->mctx.chan_nr, dl->mctx.link_id,
+			dl->mctx.n201);
+}
+
+static int lapdm_send_ua(struct lapdm_msg_ctx *mctx, uint8_t len, uint8_t *data)
+{
+	uint8_t sapi = mctx->link_id & 7;
+	uint8_t f_bit = LAPDm_CTRL_PF_BIT(mctx->ctrl);
+	struct msgb *msg = msgb_alloc_headroom(23+10, 10, "LAPDm UA");
+	struct lapdm_entity *le = mctx->dl->entity;
+
+	msg->l2h = msgb_put(msg, 3 + len);
+	msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.resp);
+	msg->l2h[1] = LAPDm_CTRL_U(LAPDm_U_UA, f_bit);
+	msg->l2h[2] = LAPDm_LEN(len);
+	if (len)
+		memcpy(msg->l2h + 3, data, len);
+
+	return tx_ph_data_enqueue(mctx->dl, msg, mctx->chan_nr, mctx->link_id,
+			mctx->n201);
+}
+
+static int lapdm_send_dm(struct lapdm_msg_ctx *mctx)
+{
+	uint8_t sapi = mctx->link_id & 7;
+	uint8_t f_bit = LAPDm_CTRL_PF_BIT(mctx->ctrl);
+	struct msgb *msg = msgb_alloc_headroom(23+10, 10, "LAPDm DM");
+	struct lapdm_entity *le = mctx->dl->entity;
+
+	msg->l2h = msgb_put(msg, 3);
+	msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.resp);
+	msg->l2h[1] = LAPDm_CTRL_U(LAPDm_U_DM, f_bit);
+	msg->l2h[2] = 0;
+
+	return tx_ph_data_enqueue(mctx->dl, msg, mctx->chan_nr, mctx->link_id,
+			mctx->n201);
+}
+
+static int lapdm_send_rr(struct lapdm_msg_ctx *mctx, uint8_t f_bit)
+{
+	uint8_t sapi = mctx->link_id & 7;
+	struct msgb *msg = msgb_alloc_headroom(23+10, 10, "LAPDm RR");
+	struct lapdm_entity *le = mctx->dl->entity;
+
+	msg->l2h = msgb_put(msg, 3);
+	msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.resp);
+	msg->l2h[1] = LAPDm_CTRL_S(mctx->dl->V_recv, LAPDm_S_RR, f_bit);
+	msg->l2h[2] = LAPDm_LEN(0);
+
+	return tx_ph_data_enqueue(mctx->dl, msg, mctx->chan_nr, mctx->link_id,
+			mctx->n201);
+}
+
+static int lapdm_send_rnr(struct lapdm_msg_ctx *mctx, uint8_t f_bit)
+{
+	uint8_t sapi = mctx->link_id & 7;
+	struct msgb *msg = msgb_alloc_headroom(23+10, 10, "LAPDm RNR");
+	struct lapdm_entity *le = mctx->dl->entity;
+
+	msg->l2h = msgb_put(msg, 3);
+	msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.resp);
+	msg->l2h[1] = LAPDm_CTRL_S(mctx->dl->V_recv, LAPDm_S_RNR, f_bit);
+	msg->l2h[2] = LAPDm_LEN(0);
+
+	return tx_ph_data_enqueue(mctx->dl, msg, mctx->chan_nr, mctx->link_id,
+			mctx->n201);
+}
+
+static int lapdm_send_rej(struct lapdm_msg_ctx *mctx, uint8_t f_bit)
+{
+	uint8_t sapi = mctx->link_id & 7;
+	struct msgb *msg = msgb_alloc_headroom(23+10, 10, "LAPDm REJ");
+	struct lapdm_entity *le = mctx->dl->entity;
+
+	msg->l2h = msgb_put(msg, 3);
+	msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.resp);
+	msg->l2h[1] = LAPDm_CTRL_S(mctx->dl->V_recv, LAPDm_S_REJ, f_bit);
+	msg->l2h[2] = LAPDm_LEN(0);
+
+	return tx_ph_data_enqueue(mctx->dl, msg, mctx->chan_nr, mctx->link_id,
+			mctx->n201);
+}
+
+/* Timer callback on T200 expiry */
+static void lapdm_t200_cb(void *data)
+{
+	struct lapdm_datalink *dl = data;
+
+	LOGP(DLLAPDM, LOGL_INFO, "lapdm_t200_cb(%p) state=%u\n", dl, dl->state);
+
+	switch (dl->state) {
+	case LAPDm_STATE_SABM_SENT:
+		/* 5.4.1.3 */
+		if (dl->retrans_ctr + 1 >= N200_EST_REL + 1) {
+			/* send RELEASE INDICATION to L3 */
+			send_rll_simple(RSL_MT_REL_IND, &dl->mctx);
+			/* send MDL ERROR INIDCATION to L3 */
+			rsl_rll_error(RLL_CAUSE_T200_EXPIRED, &dl->mctx);
+			/* flush tx buffers */
+			lapdm_dl_flush_tx(dl);
+			/* go back to idle state */
+			lapdm_dl_newstate(dl, LAPDm_STATE_IDLE);
+			/* NOTE: we must not change any other states or buffers
+			 * and queues, since we may reconnect after handover
+			 * failure. the buffered messages is replaced there */
+			break;
+		}
+		/* retransmit SABM command */
+		lapdm_send_resend(dl);
+		/* increment re-transmission counter */
+		dl->retrans_ctr++;
+		/* restart T200 (PH-READY-TO-SEND) */
+		osmo_timer_schedule(&dl->t200, T200);
+		break;
+	case LAPDm_STATE_DISC_SENT:
+		/* 5.4.4.3 */
+		if (dl->retrans_ctr + 1 >= N200_EST_REL + 1) {
+			/* send RELEASE INDICATION to L3 */
+			send_rll_simple(RSL_MT_REL_CONF, &dl->mctx);
+			/* send MDL ERROR INIDCATION to L3 */
+			rsl_rll_error(RLL_CAUSE_T200_EXPIRED, &dl->mctx);
+			/* flush buffers */
+			lapdm_dl_flush_tx(dl);
+			lapdm_dl_flush_send(dl);
+			/* go back to idle state */
+			lapdm_dl_newstate(dl, LAPDm_STATE_IDLE);
+			/* NOTE: we must not change any other states or buffers
+			 * and queues, since we may reconnect after handover
+			 * failure. the buffered messages is replaced there */
+			break;
+		}
+		/* retransmit DISC command */
+		lapdm_send_resend(dl);
+		/* increment re-transmission counter */
+		dl->retrans_ctr++;
+		/* restart T200 (PH-READY-TO-SEND) */
+		osmo_timer_schedule(&dl->t200, T200);
+		break;
+	case LAPDm_STATE_MF_EST:
+		/* 5.5.7 */
+		dl->retrans_ctr = 0;
+		lapdm_dl_newstate(dl, LAPDm_STATE_TIMER_RECOV);
+		/* fall through */
+	case LAPDm_STATE_TIMER_RECOV:
+		dl->retrans_ctr++;
+		if (dl->retrans_ctr < N200) {
+			/* retransmit I frame (V_s-1) with P=1, if any */
+			if (dl->tx_length[sub_mod8(dl->V_send, 1)]) {
+				struct msgb *msg;
+				int length;
+
+				LOGP(DLLAPDM, LOGL_INFO, "retransmit last frame "
+					"V(S)=%d\n", sub_mod8(dl->V_send, 1));
+				/* Create I frame (segment) from tx_hist */
+				length = dl->tx_length[sub_mod8(dl->V_send, 1)];
+				msg = msgb_alloc_headroom(23+10, 10, "LAPDm I");
+				msg->l2h = msgb_put(msg, length);
+				memcpy(msg->l2h,
+					dl->tx_hist[sub_mod8(dl->V_send, 1)],
+					length);
+				msg->l2h[1] = LAPDm_CTRL_I(dl->V_recv,
+					sub_mod8(dl->V_send, 1), 1); /* P=1 */
+				tx_ph_data_enqueue(dl, msg, dl->mctx.chan_nr,
+					dl->mctx.link_id, dl->mctx.n201);
+			} else {
+			/* OR send appropriate supervision frame with P=1 */
+				if (!dl->own_busy && !dl->seq_err_cond) {
+					lapdm_send_rr(&dl->mctx, 1);
+					/* NOTE: In case of sequence error
+					 * condition, the REJ frame has been
+					 * transmitted when entering the
+					 * condition, so it has not be done
+					 * here
+				 	 */
+				} else if (dl->own_busy) {
+					lapdm_send_rnr(&dl->mctx, 1);
+				} else {
+					LOGP(DLLAPDM, LOGL_INFO, "unhandled, "
+						"pls. fix\n");
+				}
+			}
+			/* restart T200 (PH-READY-TO-SEND) */
+			osmo_timer_schedule(&dl->t200, T200);
+		} else {
+			/* send MDL ERROR INIDCATION to L3 */
+			rsl_rll_error(RLL_CAUSE_T200_EXPIRED, &dl->mctx);
+		}
+		break;
+	default:
+		LOGP(DLLAPDM, LOGL_INFO, "T200 expired in unexpected "
+			"dl->state %u\n", dl->state);
+	}
+}
+
+/* 5.5.3.1: Common function to acknowlege frames up to the given N(R) value */
+static void lapdm_acknowledge(struct lapdm_msg_ctx *mctx)
+{
+	struct lapdm_datalink *dl = mctx->dl;
+	uint8_t nr = LAPDm_CTRL_Nr(mctx->ctrl);
+	int s = 0, rej = 0, t200_reset = 0;
+	int i;
+
+	/* supervisory frame ? */
+	if (LAPDm_CTRL_is_S(mctx->ctrl))
+		s = 1;
+	/* REJ frame ? */
+	if (s && LAPDm_CTRL_S_BITS(mctx->ctrl) == LAPDm_S_REJ)
+	 	rej = 1;
+
+	/* Flush all transmit buffers of acknowledged frames */
+	for (i = dl->V_ack; i != nr; i = inc_mod8(i)) {
+		if (dl->tx_length[i]) {
+			dl->tx_length[i] = 0;
+			LOGP(DLLAPDM, LOGL_INFO, "ack frame %d\n", i);
+		}
+	}
+
+	if (dl->state != LAPDm_STATE_TIMER_RECOV) {
+		/* When not in the timer recovery condition, the data
+		 * link layer entity shall reset the timer T200 on
+		 * receipt of a valid I frame with N(R) higher than V(A),
+		 * or an REJ with an N(R) equal to V(A). */
+		if ((!rej && nr != dl->V_ack)
+		 || (rej && nr == dl->V_ack)) {
+			LOGP(DLLAPDM, LOGL_INFO, "reset t200\n");
+		 	t200_reset = 1;
+			osmo_timer_del(&dl->t200);
+			/* 5.5.3.1 Note 1 + 2 imply timer recovery cond. */
+		}
+		/* 5.7.4: N(R) sequence error
+		 * N(R) is called valid, if and only if
+		 * (N(R)-V(A)) mod 8 <= (V(S)-V(A)) mod 8.
+		 */
+		if (sub_mod8(nr, dl->V_ack) > sub_mod8(dl->V_send, dl->V_ack)) {
+			LOGP(DLLAPDM, LOGL_NOTICE, "N(R) sequence error\n");
+			rsl_rll_error(RLL_CAUSE_SEQ_ERR, mctx);
+		}
+	}
+
+	/* V(A) shall be set to the value of N(R) */
+	dl->V_ack = nr;
+
+	/* If T200 has been reset by the receipt of an I, RR or RNR frame,
+	 * and if there are outstanding I frames, restart T200 */
+	if (t200_reset && !rej) {
+		if (dl->tx_length[dl->V_send - 1]) {
+			LOGP(DLLAPDM, LOGL_INFO, "start T200, due to unacked I "
+				"frame(s)\n");
+			osmo_timer_schedule(&dl->t200, T200);
+		}
+	}
+}
+
+/* L1 -> L2 */
+
+/* Receive a LAPDm U (Unnumbered) message from L1 */
+static int lapdm_rx_u(struct msgb *msg, struct lapdm_msg_ctx *mctx)
+{
+	struct lapdm_datalink *dl = mctx->dl;
+	struct lapdm_entity *le = dl->entity;
+	uint8_t length;
+	int rc;
+	int rsl_msg;
+
+	switch (LAPDm_CTRL_U_BITS(mctx->ctrl)) {
+	case LAPDm_U_SABM:
+		rsl_msg = RSL_MT_EST_IND;
+
+		LOGP(DLLAPDM, LOGL_INFO, "SABM received\n");
+		/* 5.7.1 */
+		dl->seq_err_cond = 0;
+		/* G.2.2 Wrong value of the C/R bit */
+		if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.resp) {
+			LOGP(DLLAPDM, LOGL_NOTICE, "SABM response error\n");
+			msgb_free(msg);
+			rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+			return -EINVAL;
+		}
+
+		length = msg->l2h[2] >> 2;
+		/* G.4.5 If SABM is received with L>N201 or with M bit
+		 * set, AN MDL-ERROR-INDICATION is sent to MM.
+		 */
+		if ((msg->l2h[2] & LAPDm_MORE) || length + 3 > mctx->n201) {
+			LOGP(DLLAPDM, LOGL_NOTICE, "SABM too large error\n");
+			msgb_free(msg);
+			rsl_rll_error(RLL_CAUSE_UFRM_INC_PARAM, mctx);
+			return -EIO;
+		}
+
+		/* Must be Format B */
+		rc = check_length_ind(mctx, msg->l2h[2]);
+		if (rc < 0) {
+			msgb_free(msg);
+			return rc;
+		}
+		switch (dl->state) {
+		case LAPDm_STATE_IDLE:
+			/* Set chan_nr and link_id for established connection */
+			memset(&dl->mctx, 0, sizeof(dl->mctx));
+			dl->mctx.dl = dl;
+			dl->mctx.chan_nr = mctx->chan_nr;
+			dl->mctx.link_id = mctx->link_id;
+			dl->mctx.n201 = mctx->n201;
+			break;
+		case LAPDm_STATE_MF_EST:
+			if (length == 0) {
+				rsl_msg = RSL_MT_EST_CONF;
+				break;
+			}
+			LOGP(DLLAPDM, LOGL_INFO, "SABM command, multiple "
+				"frame established state\n");
+			/* check for contention resoultion */
+			if (dl->tx_hist[0][2] >> 2) {
+				LOGP(DLLAPDM, LOGL_NOTICE, "SABM not allowed "
+					"during contention resolution\n");
+				rsl_rll_error(RLL_CAUSE_SABM_INFO_NOTALL, mctx);
+			}
+			msgb_free(msg);
+			return 0;
+		case LAPDm_STATE_DISC_SENT:
+			/* 5.4.6.2 send DM with F=P */
+			lapdm_send_dm(mctx);
+			/* reset Timer T200 */
+			osmo_timer_del(&dl->t200);
+			msgb_free(msg);
+			return send_rll_simple(RSL_MT_REL_CONF, mctx);
+		default:
+			lapdm_send_ua(mctx, length, msg->l2h + 3);
+			msgb_free(msg);
+			return 0;
+		}
+		/* send UA response */
+		lapdm_send_ua(mctx, length, msg->l2h + 3);
+		/* set Vs, Vr and Va to 0 */
+		dl->V_send = dl->V_recv = dl->V_ack = 0;
+		/* clear tx_hist */
+		dl->tx_length[0] = 0;
+		/* enter multiple-frame-established state */
+		lapdm_dl_newstate(dl, LAPDm_STATE_MF_EST);
+		/* send notification to L3 */
+		if (length == 0) {
+			/* 5.4.1.2 Normal establishment procedures */
+			rc = send_rll_simple(rsl_msg, mctx);
+			msgb_free(msg);
+		} else {
+			/* 5.4.1.4 Contention resolution establishment */
+			msg->l3h = msg->l2h + 3;
+			msgb_pull_l2h(msg);
+			rc = send_rslms_rll_l3(rsl_msg, mctx, msg);
+		}
+		break;
+	case LAPDm_U_DM:
+		LOGP(DLLAPDM, LOGL_INFO, "DM received\n");
+		/* G.2.2 Wrong value of the C/R bit */
+		if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.cmd) {
+			LOGP(DLLAPDM, LOGL_NOTICE, "DM command error\n");
+			msgb_free(msg);
+			rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+			return -EINVAL;
+		}
+		if (!LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+			/* 5.4.1.2 DM responses with the F bit set to "0"
+			 * shall be ignored.
+			 */
+			msgb_free(msg);
+			return 0;
+		}
+		switch (dl->state) {
+		case LAPDm_STATE_SABM_SENT:
+			break;
+		case LAPDm_STATE_MF_EST:
+			if (LAPDm_CTRL_PF_BIT(mctx->ctrl) == 1) {
+				LOGP(DLLAPDM, LOGL_INFO, "unsolicited DM "
+					"response\n");
+				rsl_rll_error(RLL_CAUSE_UNSOL_DM_RESP, mctx);
+			} else {
+				LOGP(DLLAPDM, LOGL_INFO, "unsolicited DM "
+					"response, multiple frame established "
+					"state\n");
+				rsl_rll_error(RLL_CAUSE_UNSOL_DM_RESP_MF, mctx);
+			}
+			msgb_free(msg);
+			return 0;
+		case LAPDm_STATE_TIMER_RECOV:
+			/* DM is normal in case PF = 1 */
+			if (LAPDm_CTRL_PF_BIT(mctx->ctrl) == 0) {
+				LOGP(DLLAPDM, LOGL_INFO, "unsolicited DM "
+					"response, multiple frame established "
+					"state\n");
+				rsl_rll_error(RLL_CAUSE_UNSOL_DM_RESP_MF, mctx);
+				msgb_free(msg);
+				return 0;
+			}
+			break;
+		case LAPDm_STATE_DISC_SENT:
+			/* reset Timer T200 */
+			osmo_timer_del(&dl->t200);
+			/* go to idle state */
+			lapdm_dl_newstate(dl, LAPDm_STATE_IDLE);
+			rc = send_rll_simple(RSL_MT_REL_CONF, mctx);
+			msgb_free(msg);
+			return 0;
+		case LAPDm_STATE_IDLE:
+			/* 5.4.5 all other frame types shall be discarded */
+		default:
+			LOGP(DLLAPDM, LOGL_INFO, "unsolicited DM response! "
+				"(discarding)\n");
+			msgb_free(msg);
+			return 0;
+		}
+		/* reset T200 */
+		osmo_timer_del(&dl->t200);
+		rc = send_rll_simple(RSL_MT_REL_IND, mctx);
+		msgb_free(msg);
+		break;
+	case LAPDm_U_UI:
+		LOGP(DLLAPDM, LOGL_INFO, "UI received\n");
+		/* G.2.2 Wrong value of the C/R bit */
+		if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.resp) {
+			LOGP(DLLAPDM, LOGL_NOTICE, "UI indicates response "
+				"error\n");
+			msgb_free(msg);
+			rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+			return -EINVAL;
+		}
+
+		length = msg->l2h[2] >> 2;
+		/* FIXME: G.4.5 If UI is received with L>N201 or with M bit
+		 * set, AN MDL-ERROR-INDICATION is sent to MM.
+		 */
+
+		if (mctx->lapdm_fmt == LAPDm_FMT_B4) {
+			length = N201_B4;
+			msg->l3h = msg->l2h + 2;
+		} else {
+			rc = check_length_ind(mctx, msg->l2h[2]);
+			if (rc < 0) {
+				msgb_free(msg);
+				return rc;
+			}
+			length = msg->l2h[2] >> 2;
+			msg->l3h = msg->l2h + 3;
+		}
+		/* do some length checks */
+		if (length == 0) {
+			/* 5.3.3 UI frames received with the length indicator
+			 * set to "0" shall be ignored
+			 */
+			LOGP(DLLAPDM, LOGL_INFO, "length=0 (discarding)\n");
+			msgb_free(msg);
+			return 0;
+		}
+		switch (LAPDm_ADDR_SAPI(mctx->addr)) {
+		case LAPDm_SAPI_NORMAL:
+		case LAPDm_SAPI_SMS:
+			break;
+		default:
+			/* 5.3.3 UI frames with invalid SAPI values shall be
+			 * discarded
+			 */
+			LOGP(DLLAPDM, LOGL_INFO, "sapi=%u (discarding)\n",
+				LAPDm_ADDR_SAPI(mctx->addr));
+			msgb_free(msg);
+			return 0;
+		}
+		msgb_pull_l2h(msg);
+		rc = send_rslms_rll_l3_ui(mctx, msg);
+		break;
+	case LAPDm_U_DISC:
+		rsl_msg = RSL_MT_REL_IND;
+
+		LOGP(DLLAPDM, LOGL_INFO, "DISC received\n");
+		/* flush buffers */
+		lapdm_dl_flush_tx(dl);
+		lapdm_dl_flush_send(dl);
+		/* 5.7.1 */
+		dl->seq_err_cond = 0;
+		/* G.2.2 Wrong value of the C/R bit */
+		if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.resp) {
+			LOGP(DLLAPDM, LOGL_NOTICE, "DISC response error\n");
+			msgb_free(msg);
+			rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+			return -EINVAL;
+		}
+		length = msg->l2h[2] >> 2;
+		if (length > 0 || msg->l2h[2] & 0x02) {
+			/* G.4.4 If a DISC or DM frame is received with L>0 or
+			 * with the M bit set to "1", an MDL-ERROR-INDICATION
+			 * primitive with cause "U frame with incorrect
+			 * parameters" is sent to the mobile management entity.
+			 */
+			LOGP(DLLAPDM, LOGL_NOTICE,
+				"U frame iwth incorrect parameters ");
+			msgb_free(msg);
+			rsl_rll_error(RLL_CAUSE_UFRM_INC_PARAM, mctx);
+			return -EIO;
+		}
+		switch (dl->state) {
+		case LAPDm_STATE_IDLE:
+			LOGP(DLLAPDM, LOGL_INFO, "DISC in idle state\n");
+			/* send DM with F=P */
+			msgb_free(msg);
+			return lapdm_send_dm(mctx);
+		case LAPDm_STATE_SABM_SENT:
+			LOGP(DLLAPDM, LOGL_INFO, "DISC in SABM state\n");
+			/* 5.4.6.2 send DM with F=P */
+			lapdm_send_dm(mctx);
+			/* reset Timer T200 */
+			osmo_timer_del(&dl->t200);
+			msgb_free(msg);
+			return send_rll_simple(RSL_MT_REL_IND, mctx);
+		case LAPDm_STATE_MF_EST:
+		case LAPDm_STATE_TIMER_RECOV:
+			LOGP(DLLAPDM, LOGL_INFO, "DISC in est state\n");
+			break;
+		case LAPDm_STATE_DISC_SENT:
+			LOGP(DLLAPDM, LOGL_INFO, "DISC in disc state\n");
+			rsl_msg = RSL_MT_REL_CONF;
+			break;
+		default:
+			lapdm_send_ua(mctx, length, msg->l2h + 3);
+			msgb_free(msg);
+			return 0;
+		}
+		/* send UA response */
+		lapdm_send_ua(mctx, length, msg->l2h + 3);
+		/* reset Timer T200 */
+		osmo_timer_del(&dl->t200);
+		/* enter idle state */
+		lapdm_dl_newstate(dl, LAPDm_STATE_IDLE);
+		/* send notification to L3 */
+		rc = send_rll_simple(rsl_msg, mctx);
+		msgb_free(msg);
+		break;
+	case LAPDm_U_UA:
+		LOGP(DLLAPDM, LOGL_INFO, "UA received\n");
+		/* G.2.2 Wrong value of the C/R bit */
+		if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.cmd) {
+			LOGP(DLLAPDM, LOGL_NOTICE, "UA indicates command "
+				"error\n");
+			msgb_free(msg);
+			rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+			return -EINVAL;
+		}
+
+		length = msg->l2h[2] >> 2;
+		/* G.4.5 If UA is received with L>N201 or with M bit
+		 * set, AN MDL-ERROR-INDICATION is sent to MM.
+		 */
+		if ((msg->l2h[2] & LAPDm_MORE) || length + 3 > mctx->n201) {
+			LOGP(DLLAPDM, LOGL_NOTICE, "UA too large error\n");
+			msgb_free(msg);
+			rsl_rll_error(RLL_CAUSE_UFRM_INC_PARAM, mctx);
+			return -EIO;
+		}
+
+		if (!LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+			/* 5.4.1.2 A UA response with the F bit set to "0"
+			 * shall be ignored.
+			 */
+			LOGP(DLLAPDM, LOGL_INFO, "F=0 (discarding)\n");
+			msgb_free(msg);
+			return 0;
+		}
+		switch (dl->state) {
+		case LAPDm_STATE_SABM_SENT:
+			break;
+		case LAPDm_STATE_MF_EST:
+		case LAPDm_STATE_TIMER_RECOV:
+			LOGP(DLLAPDM, LOGL_INFO, "unsolicited UA response! "
+				"(discarding)\n");
+			rsl_rll_error(RLL_CAUSE_UNSOL_UA_RESP, mctx);
+			msgb_free(msg);
+			return 0;
+		case LAPDm_STATE_DISC_SENT:
+			LOGP(DLLAPDM, LOGL_INFO, "UA in disconnect state\n");
+			/* reset Timer T200 */
+			osmo_timer_del(&dl->t200);
+			/* go to idle state */
+			lapdm_dl_newstate(dl, LAPDm_STATE_IDLE);
+			rc = send_rll_simple(RSL_MT_REL_CONF, mctx);
+			msgb_free(msg);
+			return 0;
+		case LAPDm_STATE_IDLE:
+			/* 5.4.5 all other frame types shall be discarded */
+		default:
+			LOGP(DLLAPDM, LOGL_INFO, "unsolicited UA response! "
+				"(discarding)\n");
+			msgb_free(msg);
+			return 0;
+		}
+		LOGP(DLLAPDM, LOGL_INFO, "UA in SABM state\n");
+		/* reset Timer T200 */
+		osmo_timer_del(&dl->t200);
+		/* compare UA with SABME if contention resolution is applied */
+		if (dl->tx_hist[0][2] >> 2) {
+			rc = check_length_ind(mctx, msg->l2h[2]);
+			if (rc < 0) {
+				rc = send_rll_simple(RSL_MT_REL_IND, mctx);
+				msgb_free(msg);
+				/* go to idle state */
+				lapdm_dl_newstate(dl, LAPDm_STATE_IDLE);
+				return 0;
+			}
+			length = msg->l2h[2] >> 2;
+			if (length != (dl->tx_hist[0][2] >> 2)
+			 || !!memcmp(dl->tx_hist[0] + 3, msg->l2h + 3,
+			 		length)) {
+				LOGP(DLLAPDM, LOGL_INFO, "**** UA response "
+					"mismatches ****\n");
+				rc = send_rll_simple(RSL_MT_REL_IND, mctx);
+				msgb_free(msg);
+				/* go to idle state */
+				lapdm_dl_newstate(dl, LAPDm_STATE_IDLE);
+				return 0;
+			}
+		}
+		/* set Vs, Vr and Va to 0 */
+		dl->V_send = dl->V_recv = dl->V_ack = 0;
+		/* clear tx_hist */
+		dl->tx_length[0] = 0;
+		/* enter multiple-frame-established state */
+		lapdm_dl_newstate(dl, LAPDm_STATE_MF_EST);
+		/* send outstanding frames, if any (resume / reconnect) */
+		rslms_send_i(mctx, __LINE__);
+		/* send notification to L3 */
+		rc = send_rll_simple(RSL_MT_EST_CONF, mctx);
+		msgb_free(msg);
+		break;
+	default:
+		/* G.3.1 */
+		LOGP(DLLAPDM, LOGL_NOTICE, "Unnumbered frame not allowed.\n");
+		msgb_free(msg);
+		rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+		return -EINVAL;
+	}
+	return rc;
+}
+
+/* Receive a LAPDm S (Supervisory) message from L1 */
+static int lapdm_rx_s(struct msgb *msg, struct lapdm_msg_ctx *mctx)
+{
+	struct lapdm_datalink *dl = mctx->dl;
+	struct lapdm_entity *le = dl->entity;
+	uint8_t length;
+
+	length = msg->l2h[2] >> 2;
+	if (length > 0 || msg->l2h[2] & 0x02) {
+		/* G.4.3 If a supervisory frame is received with L>0 or
+		 * with the M bit set to "1", an MDL-ERROR-INDICATION
+		 * primitive with cause "S frame with incorrect
+		 * parameters" is sent to the mobile management entity. */
+		LOGP(DLLAPDM, LOGL_NOTICE,
+				"S frame with incorrect parameters\n");
+		msgb_free(msg);
+		rsl_rll_error(RLL_CAUSE_SFRM_INC_PARAM, mctx);
+		return -EIO;
+	}
+
+	if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.resp
+	 && LAPDm_CTRL_PF_BIT(mctx->ctrl)
+	 && dl->state != LAPDm_STATE_TIMER_RECOV) {
+		/* 5.4.2.2: Inidcate error on supervisory reponse F=1 */
+		LOGP(DLLAPDM, LOGL_NOTICE, "S frame response with F=1 error\n");
+		rsl_rll_error(RLL_CAUSE_UNSOL_SPRV_RESP, mctx);
+	}
+
+	switch (dl->state) {
+	case LAPDm_STATE_IDLE:
+		/* if P=1, respond DM with F=1 (5.2.2) */
+		/* 5.4.5 all other frame types shall be discarded */
+		if (LAPDm_CTRL_PF_BIT(mctx->ctrl))
+			lapdm_send_dm(mctx); /* F=P */
+		/* fall though */
+	case LAPDm_STATE_SABM_SENT:
+	case LAPDm_STATE_DISC_SENT:
+		LOGP(DLLAPDM, LOGL_NOTICE, "S frame ignored in this state\n");
+		msgb_free(msg);
+		return 0;
+	}
+	switch (LAPDm_CTRL_S_BITS(mctx->ctrl)) {
+	case LAPDm_S_RR:
+		LOGP(DLLAPDM, LOGL_INFO, "RR received\n");
+		/* 5.5.3.1: Acknowlege all tx frames up the the N(R)-1 */
+		lapdm_acknowledge(mctx);
+
+		/* 5.5.3.2 */
+		if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.cmd
+		 && LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+		 	if (!dl->own_busy && !dl->seq_err_cond) {
+				LOGP(DLLAPDM, LOGL_NOTICE, "RR frame command "
+					"with polling bit set and we are not "
+					"busy, so we reply with RR frame\n");
+				lapdm_send_rr(mctx, 1);
+				/* NOTE: In case of sequence error condition,
+				 * the REJ frame has been transmitted when
+				 * entering the condition, so it has not be
+				 * done here
+				 */
+			} else if (dl->own_busy) {
+				LOGP(DLLAPDM, LOGL_NOTICE, "RR frame command "
+					"with polling bit set and we are busy, "
+					"so we reply with RR frame\n");
+				lapdm_send_rnr(mctx, 1);
+			}
+		} else if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.resp
+			&& LAPDm_CTRL_PF_BIT(mctx->ctrl)
+			&& dl->state == LAPDm_STATE_TIMER_RECOV) {
+			LOGP(DLLAPDM, LOGL_INFO, "RR response with F==1, "
+				"and we are in timer recovery state, so "
+				"we leave that state\n");
+			/* V(S) to the N(R) in the RR frame */
+			dl->V_send = LAPDm_CTRL_Nr(mctx->ctrl);
+			/* reset Timer T200 */
+			osmo_timer_del(&dl->t200);
+			/* 5.5.7 Clear timer recovery condition */
+			lapdm_dl_newstate(dl, LAPDm_STATE_MF_EST);
+		}
+		/* Send message, if possible due to acknowledged data */
+		rslms_send_i(mctx, __LINE__);
+
+		break;
+	case LAPDm_S_RNR:
+		LOGP(DLLAPDM, LOGL_INFO, "RNR received\n");
+		/* 5.5.3.1: Acknowlege all tx frames up the the N(R)-1 */
+		lapdm_acknowledge(mctx);
+
+		/* 5.5.5 */
+		/* Set peer receiver busy condition */
+		dl->peer_busy = 1;
+
+		if (LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+			if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.cmd) {
+				if (!dl->own_busy) {
+					LOGP(DLLAPDM, LOGL_INFO, "RNR poll "
+						"command and we are not busy, "
+						"so we reply with RR final "
+						"response\n");
+					/* Send RR with F=1 */
+					lapdm_send_rr(mctx, 1);
+				} else {
+					LOGP(DLLAPDM, LOGL_INFO, "RNR poll "
+						"command and we are busy, so "
+						"we reply with RNR final "
+						"response\n");
+					/* Send RNR with F=1 */
+					lapdm_send_rnr(mctx, 1);
+				}
+			} else if (dl->state == LAPDm_STATE_TIMER_RECOV) {
+				LOGP(DLLAPDM, LOGL_INFO, "RNR poll response "
+					"and we in timer recovery state, so "
+					"we leave that state\n");
+				/* 5.5.7 Clear timer recovery condition */
+				lapdm_dl_newstate(dl, LAPDm_STATE_MF_EST);
+				/* V(S) to the N(R) in the RNR frame */
+				dl->V_send = LAPDm_CTRL_Nr(mctx->ctrl);
+			}
+		} else
+			LOGP(DLLAPDM, LOGL_INFO, "RNR not polling/final state "
+				"received\n");
+
+		/* Send message, if possible due to acknowledged data */
+		rslms_send_i(mctx, __LINE__);
+
+		break;
+	case LAPDm_S_REJ:
+		LOGP(DLLAPDM, LOGL_INFO, "REJ received\n");
+		/* 5.5.3.1: Acknowlege all tx frames up the the N(R)-1 */
+		lapdm_acknowledge(mctx);
+
+		/* 5.5.4.1 */
+		if (dl->state != LAPDm_STATE_TIMER_RECOV) {
+			/* Clear an existing peer receiver busy condition */
+			dl->peer_busy = 0;
+			/* V(S) and V(A) to the N(R) in the REJ frame */
+			dl->V_send = dl->V_ack = LAPDm_CTRL_Nr(mctx->ctrl);
+			/* reset Timer T200 */
+			osmo_timer_del(&dl->t200);
+			/* 5.5.3.2 */
+			if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.cmd
+			 && LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+				if (!dl->own_busy && !dl->seq_err_cond) {
+					LOGP(DLLAPDM, LOGL_INFO, "REJ poll "
+						"command not in timer recovery "
+						"state and not in own busy "
+						"condition received, so we "
+						"respond with RR final "
+						"response\n");
+					lapdm_send_rr(mctx, 1);
+					/* NOTE: In case of sequence error
+					 * condition, the REJ frame has been
+					 * transmitted when entering the
+					 * condition, so it has not be done
+					 * here
+				 	 */
+				} else if (dl->own_busy) {
+					LOGP(DLLAPDM, LOGL_INFO, "REJ poll "
+						"command not in timer recovery "
+						"state and in own busy "
+						"condition received, so we "
+						"respond with RNR final "
+						"response\n");
+					lapdm_send_rnr(mctx, 1);
+				}
+			} else
+				LOGP(DLLAPDM, LOGL_INFO, "REJ response or not "
+					"polling command not in timer recovery "
+					"state received\n");
+			/* send MDL ERROR INIDCATION to L3 */
+			if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.resp
+			 && LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+				rsl_rll_error(RLL_CAUSE_UNSOL_SPRV_RESP, mctx);
+			}
+
+		} else if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.resp
+			&& LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+			LOGP(DLLAPDM, LOGL_INFO, "REJ poll response in timer "
+				"recovery state received\n");
+			/* Clear an existing peer receiver busy condition */
+			dl->peer_busy = 0;
+			/* 5.5.7 Clear timer recovery condition */
+			lapdm_dl_newstate(dl, LAPDm_STATE_MF_EST);
+			/* V(S) and V(A) to the N(R) in the REJ frame */
+			dl->V_send = dl->V_ack = LAPDm_CTRL_Nr(mctx->ctrl);
+			/* reset Timer T200 */
+			osmo_timer_del(&dl->t200);
+		} else {
+			/* Clear an existing peer receiver busy condition */
+			dl->peer_busy = 0;
+			/* V(S) and V(A) to the N(R) in the REJ frame */
+			dl->V_send = dl->V_ack = LAPDm_CTRL_Nr(mctx->ctrl);
+			/* 5.5.3.2 */
+			if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.cmd
+			 && LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+				if (!dl->own_busy && !dl->seq_err_cond) {
+					LOGP(DLLAPDM, LOGL_INFO, "REJ poll "
+						"command in timer recovery "
+						"state and not in own busy "
+						"condition received, so we "
+						"respond with RR final "
+						"response\n");
+					lapdm_send_rr(mctx, 1);
+					/* NOTE: In case of sequence error
+					 * condition, the REJ frame has been
+					 * transmitted when entering the
+					 * condition, so it has not be done
+					 * here
+				 	 */
+				} else if (dl->own_busy) {
+					LOGP(DLLAPDM, LOGL_INFO, "REJ poll "
+						"command in timer recovery "
+						"state and in own busy "
+						"condition received, so we "
+						"respond with RNR final "
+						"response\n");
+					lapdm_send_rnr(mctx, 1);
+				}
+			} else
+				LOGP(DLLAPDM, LOGL_INFO, "REJ response or not "
+					"polling command in timer recovery "
+					"state received\n");
+		}
+
+		/* FIXME: 5.5.4.2 2) */
+
+		/* Send message, if possible due to acknowledged data */
+		rslms_send_i(mctx, __LINE__);
+
+		break;
+	default:
+		/* G.3.1 */
+		LOGP(DLLAPDM, LOGL_NOTICE, "Supervisory frame not allowed.\n");
+		msgb_free(msg);
+		rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+		return -EINVAL;
+	}
+	msgb_free(msg);
+	return 0;
+}
+
+/* Receive a LAPDm I (Information) message from L1 */
+static int lapdm_rx_i(struct msgb *msg, struct lapdm_msg_ctx *mctx)
+{
+	struct lapdm_datalink *dl = mctx->dl;
+	struct lapdm_entity *le = dl->entity;
+	//uint8_t nr = LAPDm_CTRL_Nr(mctx->ctrl);
+	uint8_t ns = LAPDm_CTRL_I_Ns(mctx->ctrl);
+	uint8_t length;
+	int rc;
+
+	LOGP(DLLAPDM, LOGL_NOTICE, "I received\n");
+		
+	/* G.2.2 Wrong value of the C/R bit */
+	if (LAPDm_ADDR_CR(mctx->addr) == le->cr.rem2loc.resp) {
+		LOGP(DLLAPDM, LOGL_NOTICE, "I frame response not allowed\n");
+		msgb_free(msg);
+		rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+		return -EINVAL;
+	}
+
+	length = msg->l2h[2] >> 2;
+	if (length == 0 || length + 3 > mctx->n201) {
+		/* G.4.2 If the length indicator of an I frame is set
+		 * to a numerical value L>N201 or L=0, an MDL-ERROR-INDICATION
+		 * primitive with cause "I frame with incorrect length"
+		 * is sent to the mobile management entity. */
+		LOGP(DLLAPDM, LOGL_NOTICE, "I frame length not allowed\n");
+		msgb_free(msg);
+		rsl_rll_error(RLL_CAUSE_IFRM_INC_LEN, mctx);
+		return -EIO;
+	}
+
+	/* G.4.2 If the numerical value of L is L<N201 and the M
+	 * bit is set to "1", then an MDL-ERROR-INDICATION primitive with
+	 * cause "I frame with incorrect use of M bit" is sent to the
+	 * mobile management entity. */
+	if ((msg->l2h[2] & LAPDm_MORE) && length + 3 < mctx->n201) {
+		LOGP(DLLAPDM, LOGL_NOTICE, "I frame with M bit too short\n");
+		msgb_free(msg);
+		rsl_rll_error(RLL_CAUSE_IFRM_INC_MBITS, mctx);
+		return -EIO;
+	}
+
+	switch (dl->state) {
+	case LAPDm_STATE_IDLE:
+		/* if P=1, respond DM with F=1 (5.2.2) */
+		/* 5.4.5 all other frame types shall be discarded */
+		if (LAPDm_CTRL_PF_BIT(mctx->ctrl))
+			lapdm_send_dm(mctx); /* F=P */
+		/* fall though */
+	case LAPDm_STATE_SABM_SENT:
+	case LAPDm_STATE_DISC_SENT:
+		LOGP(DLLAPDM, LOGL_NOTICE, "I frame ignored in this state\n");
+		msgb_free(msg);
+		return 0;
+	}
+
+	/* 5.7.1: N(s) sequence error */
+	if (ns != dl->V_recv) {
+		LOGP(DLLAPDM, LOGL_NOTICE, "N(S) sequence error: N(S)=%u, "
+		     "V(R)=%u\n", ns, dl->V_recv);
+		/* discard data */
+		msgb_free(msg);
+		if (!dl->seq_err_cond) {
+			/* FIXME: help me understand what exactly todo here
+			dl->seq_err_cond = 1;
+			*/
+			lapdm_send_rej(mctx, LAPDm_CTRL_PF_BIT(mctx->ctrl));
+		} else {
+		}
+		return -EIO;
+	}
+	dl->seq_err_cond = 0;
+
+	/* Increment receiver state */
+	dl->V_recv = inc_mod8(dl->V_recv);
+	LOGP(DLLAPDM, LOGL_NOTICE, "incrementing V(R) to %u\n", dl->V_recv);
+
+	/* 5.5.3.1: Acknowlege all transmitted frames up the the N(R)-1 */
+	lapdm_acknowledge(mctx); /* V(A) is also set here */
+
+	/* Only if we are not in own receiver busy condition */
+	if (!dl->own_busy) {
+		/* if the frame carries a complete segment */
+		if (!(msg->l2h[2] & LAPDm_MORE)
+		 && !dl->rcv_buffer) {
+			LOGP(DLLAPDM, LOGL_INFO, "message in single I frame\n");
+			/* send a DATA INDICATION to L3 */
+			msg->l3h = msg->l2h + 3;
+			msgb_pull_l2h(msg);
+			msg->len = length;
+			msg->tail = msg->data + length;
+			rc = send_rslms_rll_l3(RSL_MT_DATA_IND, mctx, msg);
+		} else {
+			/* create rcv_buffer */
+			if (!dl->rcv_buffer) {
+				LOGP(DLLAPDM, LOGL_INFO, "message in multiple I "
+					"frames (first message)\n");
+				dl->rcv_buffer = msgb_alloc_headroom(200+56, 56,
+								"LAPDm RX");
+				dl->rcv_buffer->l3h = dl->rcv_buffer->data;
+			}
+			/* concat. rcv_buffer */
+			if (msgb_l3len(dl->rcv_buffer) + length > 200) {
+				LOGP(DLLAPDM, LOGL_NOTICE, "Received frame "
+					"overflow!\n");
+			} else {
+				memcpy(msgb_put(dl->rcv_buffer, length),
+					msg->l2h + 3, length);
+			}
+			/* if the last segment was received */
+			if (!(msg->l2h[2] & LAPDm_MORE)) {
+				LOGP(DLLAPDM, LOGL_INFO, "message in multiple I "
+					"frames (last message)\n");
+				rc = send_rslms_rll_l3(RSL_MT_DATA_IND, mctx,
+					dl->rcv_buffer);
+				dl->rcv_buffer = NULL;
+			} else
+				LOGP(DLLAPDM, LOGL_INFO, "message in multiple I "
+					"frames (next message)\n");
+			msgb_free(msg);
+
+		}
+	} else
+		LOGP(DLLAPDM, LOGL_INFO, "I frame ignored during own receiver "
+			"busy condition\n");
+
+	/* Check for P bit */
+	if (LAPDm_CTRL_PF_BIT(mctx->ctrl)) {
+		/* 5.5.2.1 */
+		/* check if we are not in own receiver busy */
+		if (!dl->own_busy) {
+			LOGP(DLLAPDM, LOGL_INFO, "we are not busy, send RR\n");
+			/* Send RR with F=1 */
+			rc = lapdm_send_rr(mctx, 1);
+		} else {
+			LOGP(DLLAPDM, LOGL_INFO, "we are busy, send RNR\n");
+			/* Send RNR with F=1 */
+			rc = lapdm_send_rnr(mctx, 1);
+		}
+	} else {
+		/* 5.5.2.2 */
+		/* check if we are not in own receiver busy */
+		if (!dl->own_busy) {
+			/* NOTE: V(R) is already set above */
+			rc = rslms_send_i(mctx, __LINE__);
+			if (rc) {
+				LOGP(DLLAPDM, LOGL_INFO, "we are not busy and "
+					"have no pending data, send RR\n");
+				/* Send RR with F=0 */
+				return lapdm_send_rr(mctx, 0);
+			}
+			/* all I or one RR is sent, we are done */
+			return 0;
+		} else {
+			LOGP(DLLAPDM, LOGL_INFO, "we are busy, send RNR\n");
+			/* Send RNR with F=0 */
+			rc = lapdm_send_rnr(mctx, 0);
+		}
+	}
+
+	/* Send message, if possible due to acknowledged data */
+	rslms_send_i(mctx, __LINE__);
+
+	return rc;
+}
+
+/* Receive a LAPDm message from L1 */
+static int lapdm_ph_data_ind(struct msgb *msg, struct lapdm_msg_ctx *mctx)
+{
+	int rc;
+
+	/* G.2.3 EA bit set to "0" is not allowed in GSM */
+	if (!LAPDm_ADDR_EA(mctx->addr)) {
+		LOGP(DLLAPDM, LOGL_NOTICE, "EA bit 0 is not allowed in GSM\n");
+		msgb_free(msg);
+		rsl_rll_error(RLL_CAUSE_FRM_UNIMPL, mctx);
+		return -EINVAL;
+	}
+
+	if (LAPDm_CTRL_is_U(mctx->ctrl))
+		rc = lapdm_rx_u(msg, mctx);
+	else if (LAPDm_CTRL_is_S(mctx->ctrl))
+		rc = lapdm_rx_s(msg, mctx);
+	else if (LAPDm_CTRL_is_I(mctx->ctrl))
+		rc = lapdm_rx_i(msg, mctx);
+	else {
+		LOGP(DLLAPDM, LOGL_NOTICE, "unknown LAPDm format\n");
+		msgb_free(msg);
+		rc = -EINVAL;
+	}
+	return rc;
+}
+
+/* input into layer2 (from layer 1) */
+static int l2_ph_data_ind(struct msgb *msg, struct lapdm_entity *le, uint8_t chan_nr, uint8_t link_id)
+{
+	uint8_t cbits = chan_nr >> 3;
+	uint8_t sapi = link_id & 7;
+	struct lapdm_msg_ctx mctx;
+	int rc = 0;
+
+	/* when we reach here, we have a msgb with l2h pointing to the raw
+	 * 23byte mac block. The l1h has already been purged. */
+
+	mctx.dl = datalink_for_sapi(le, sapi);
+	mctx.chan_nr = chan_nr;
+	mctx.link_id = link_id;
+	mctx.addr = mctx.ctrl = 0;
+
+	/* G.2.1 No action schall be taken on frames containing an unallocated
+	 * SAPI.
+	 */
+	if (!mctx.dl) {
+		LOGP(DLLAPDM, LOGL_NOTICE, "Received frame for unsupported "
+			"SAPI %d!\n", sapi);
+		return -EINVAL;
+		msgb_free(msg);
+		return -EIO;
+	}
+
+	/* check for L1 chan_nr/link_id and determine LAPDm hdr format */
+	if (cbits == 0x10 || cbits == 0x12) {
+		/* Format Bbis is used on BCCH and CCCH(PCH, NCH and AGCH) */
+		mctx.lapdm_fmt = LAPDm_FMT_Bbis;
+		mctx.n201 = N201_Bbis;
+	} else {
+		if (mctx.link_id & 0x40) {
+			/* It was received from network on SACCH, thus
+			 * lapdm_fmt must be B4 */
+			mctx.lapdm_fmt = LAPDm_FMT_B4;
+			mctx.n201 = N201_B4;
+			LOGP(DLLAPDM, LOGL_INFO, "fmt=B4\n");
+			/* SACCH frames have a two-byte L1 header that
+			 * OsmocomBB L1 doesn't strip */
+			mctx.tx_power_ind = msg->l2h[0] & 0x1f;
+			mctx.ta_ind = msg->l2h[1];
+			msgb_pull(msg, 2);
+			msg->l2h += 2;
+		} else {
+			mctx.lapdm_fmt = LAPDm_FMT_B;
+			LOGP(DLLAPDM, LOGL_INFO, "fmt=B\n");
+			mctx.n201 = 23; // FIXME: select correct size by chan.
+		}
+	}
+
+	switch (mctx.lapdm_fmt) {
+	case LAPDm_FMT_A:
+	case LAPDm_FMT_B:
+	case LAPDm_FMT_B4:
+		mctx.addr = msg->l2h[0];
+		if (!(mctx.addr & 0x01)) {
+			LOGP(DLLAPDM, LOGL_ERROR, "we don't support "
+				"multibyte addresses (discarding)\n");
+			msgb_free(msg);
+			return -EINVAL;
+		}
+		mctx.ctrl = msg->l2h[1];
+		/* obtain SAPI from address field */
+		mctx.link_id |= LAPDm_ADDR_SAPI(mctx.addr);
+		rc = lapdm_ph_data_ind(msg, &mctx);
+		break;
+	case LAPDm_FMT_Bter:
+		/* FIXME */
+		msgb_free(msg);
+		break;
+	case LAPDm_FMT_Bbis:
+		/* directly pass up to layer3 */
+		LOGP(DLLAPDM, LOGL_INFO, "fmt=Bbis UI\n");
+		msg->l3h = msg->l2h;
+		msgb_pull_l2h(msg);
+		rc = send_rslms_rll_l3(RSL_MT_UNIT_DATA_IND, &mctx, msg);
+		break;
+	default:
+		msgb_free(msg);
+	}
+
+	return rc;
+}
+
+/* input into layer2 (from layer 1) */
+static int l2_ph_rach_ind(struct lapdm_entity *le, uint8_t ra, uint32_t fn, uint8_t acc_delay)
+{
+	struct abis_rsl_cchan_hdr *ch;
+	struct gsm48_req_ref req_ref;
+	struct gsm_time gt;
+	struct msgb *msg = msgb_alloc_headroom(512, 64, "RSL CHAN RQD");
+
+	msg->l2h = msgb_push(msg, sizeof(*ch));
+	ch = (struct abis_rsl_cchan_hdr *)msg->l2h;
+	rsl_init_cchan_hdr(ch, RSL_MT_CHAN_RQD);
+	ch->chan_nr = RSL_CHAN_RACH;
+
+	/* generate a RSL CHANNEL REQUIRED message */
+	gsm_fn2gsmtime(&gt, fn);
+	req_ref.ra = ra;
+	req_ref.t1 = gt.t1; /* FIXME: modulo? */
+	req_ref.t2 = gt.t2;
+	req_ref.t3_low = gt.t3 & 7;
+	req_ref.t3_high = gt.t3 >> 3;
+
+	msgb_tv_fixed_put(msg, RSL_IE_REQ_REFERENCE, 3, (uint8_t *) &req_ref);
+	msgb_tv_put(msg, RSL_IE_ACCESS_DELAY, acc_delay);
+
+	return rslms_sendmsg(msg, le);
+}
+
+static int l2_ph_chan_conf(struct msgb *msg, struct lapdm_entity *le, uint32_t frame_nr);
+
+int lapdm_phsap_up(struct osmo_prim_hdr *oph, struct lapdm_entity *le)
+{
+	struct osmo_phsap_prim *pp = (struct osmo_phsap_prim *) oph;
+	int rc = 0;
+
+	if (oph->sap != SAP_GSM_PH) {
+		LOGP(DLLAPDM, LOGL_ERROR, "primitive for unknown SAP %u\n",
+			oph->sap);
+		return -ENODEV;
+	}
+
+	switch (oph->primitive) {
+	case PRIM_PH_DATA:
+		if (oph->operation != PRIM_OP_INDICATION) {
+			LOGP(DLLAPDM, LOGL_ERROR, "PH_DATA is not INDICATION %u\n",
+				oph->operation);
+			return -ENODEV;
+		}
+		rc = l2_ph_data_ind(oph->msg, le, pp->u.data.chan_nr,
+				    pp->u.data.link_id);
+		break;
+	case PRIM_PH_RTS:
+		if (oph->operation != PRIM_OP_INDICATION) {
+			LOGP(DLLAPDM, LOGL_ERROR, "PH_RTS is not INDICATION %u\n",
+				oph->operation);
+			return -ENODEV;
+		}
+		rc = l2_ph_data_conf(oph->msg, le);
+		break;
+	case PRIM_PH_RACH:
+		switch (oph->operation) {
+		case PRIM_OP_INDICATION:
+			rc = l2_ph_rach_ind(le, pp->u.rach_ind.ra, pp->u.rach_ind.fn,
+					    pp->u.rach_ind.acc_delay);
+			break;
+		case PRIM_OP_CONFIRM:
+			rc = l2_ph_chan_conf(oph->msg, le, pp->u.rach_ind.fn);
+			break;
+		default:
+			return -EIO;
+		}
+		break;
+	}
+
+	return rc;
+}
+
+
+/* L3 -> L2 / RSLMS -> LAPDm */
+
+/* L3 requests establishment of data link */
+static int rslms_rx_rll_est_req(struct msgb *msg, struct lapdm_datalink *dl)
+{
+	struct lapdm_entity *le = dl->entity;
+	struct abis_rsl_rll_hdr *rllh = msgb_l2(msg);
+	uint8_t chan_nr = rllh->chan_nr;
+	uint8_t link_id = rllh->link_id;
+	uint8_t sapi = rllh->link_id & 7;
+	struct tlv_parsed tv;
+	uint8_t length;
+	uint8_t n201 = 23; //FIXME
+
+	/* Set chan_nr and link_id for established connection */
+	memset(&dl->mctx, 0, sizeof(dl->mctx));
+	dl->mctx.dl = dl;
+	dl->mctx.n201 = n201;
+	dl->mctx.chan_nr = chan_nr;
+	dl->mctx.link_id = link_id;
+
+	rsl_tlv_parse(&tv, rllh->data, msgb_l2len(msg)-sizeof(*rllh));
+	if (TLVP_PRESENT(&tv, RSL_IE_L3_INFO)) {
+		msg->l3h = TLVP_VAL(&tv, RSL_IE_L3_INFO);
+		/* contention resolution establishment procedure */
+		if (sapi != 0) {
+			/* According to clause 6, the contention resolution
+			 * procedure is only permitted with SAPI value 0 */
+			LOGP(DLLAPDM, LOGL_ERROR, "SAPI != 0 but contention"
+				"resolution (discarding)\n");
+			msgb_free(msg);
+			return send_rll_simple(RSL_MT_REL_IND, &dl->mctx);
+		}
+		/* transmit a SABM command with the P bit set to "1". The SABM
+		 * command shall contain the layer 3 message unit */
+		length = TLVP_LEN(&tv, RSL_IE_L3_INFO);
+		LOGP(DLLAPDM, LOGL_INFO, "perform establishment with content "
+			"(SABM)\n");
+	} else {
+		/* normal establishment procedure */
+		length = 0;
+		LOGP(DLLAPDM, LOGL_INFO, "perform normal establishm. (SABM)\n");
+	}
+
+	/* check if the layer3 message length exceeds N201 */
+	if (length + 3 > 21) { /* FIXME: do we know the channel N201? */
+		LOGP(DLLAPDM, LOGL_ERROR, "frame too large: %d > N201(%d) "
+			"(discarding)\n", length + 3, 21);
+		msgb_free(msg);
+		return send_rll_simple(RSL_MT_REL_IND, &dl->mctx);
+	}
+
+	/* Flush send-queue */
+	/* Clear send-buffer */
+	lapdm_dl_flush_send(dl);
+
+	/* Discard partly received L3 message */
+	if (dl->rcv_buffer) {
+		msgb_free(dl->rcv_buffer);
+		dl->rcv_buffer = NULL;
+	}
+
+	/* Remove RLL header from msgb */
+	msgb_pull_l2h(msg);
+
+	/* Push LAPDm header on msgb */
+	msg->l2h = msgb_push(msg, 3);
+	msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.cmd);
+	msg->l2h[1] = LAPDm_CTRL_U(LAPDm_U_SABM, 1);
+	msg->l2h[2] = LAPDm_LEN(length);
+	/* Transmit-buffer carries exactly one segment */
+	memcpy(dl->tx_hist[0], msg->l2h, 3 + length);
+	dl->tx_length[0] = 3 + length;
+	/* set Vs to 0, because it is used as index when resending SABM */
+	dl->V_send = 0;
+	
+	/* Set states */
+	dl->own_busy = dl->peer_busy = 0;
+	dl->retrans_ctr = 0;
+	lapdm_dl_newstate(dl, LAPDm_STATE_SABM_SENT);
+
+	/* Tramsmit and start T200 */
+	osmo_timer_schedule(&dl->t200, T200);
+	return tx_ph_data_enqueue(dl, msg, chan_nr, link_id, n201);
+}
+
+/* L3 requests transfer of unnumbered information */
+static int rslms_rx_rll_udata_req(struct msgb *msg, struct lapdm_datalink *dl)
+{
+	struct lapdm_entity *le = dl->entity;
+	struct abis_rsl_rll_hdr *rllh = msgb_l2(msg);
+	uint8_t chan_nr = rllh->chan_nr;
+	uint8_t link_id = rllh->link_id;
+	uint8_t sapi = link_id & 7;
+	struct tlv_parsed tv;
+	int length;
+	uint8_t n201 = 23; //FIXME
+	uint8_t ta = 0, tx_power = 0;
+
+	/* check if the layer3 message length exceeds N201 */
+
+	rsl_tlv_parse(&tv, rllh->data, msgb_l2len(msg)-sizeof(*rllh));
+
+	if (TLVP_PRESENT(&tv, RSL_IE_TIMING_ADVANCE)) {
+		ta = *TLVP_VAL(&tv, RSL_IE_TIMING_ADVANCE);
+	}
+	if (TLVP_PRESENT(&tv, RSL_IE_MS_POWER)) {
+		tx_power = *TLVP_VAL(&tv, RSL_IE_MS_POWER);
+	}
+	if (!TLVP_PRESENT(&tv, RSL_IE_L3_INFO)) {
+		LOGP(DLLAPDM, LOGL_ERROR, "unit data request without message "
+			"error\n");
+		msgb_free(msg);
+		return -EINVAL;
+	}
+	msg->l3h = TLVP_VAL(&tv, RSL_IE_L3_INFO);
+	length = TLVP_LEN(&tv, RSL_IE_L3_INFO);
+	/* check if the layer3 message length exceeds N201 */
+	if (length + 5 > 23) { /* FIXME: do we know the channel N201? */
+		LOGP(DLLAPDM, LOGL_ERROR, "frame too large: %d > N201(%d) "
+			"(discarding)\n", length + 5, 23);
+		msgb_free(msg);
+		return -EIO;
+	}
+
+	LOGP(DLLAPDM, LOGL_INFO, "sending unit data (tx_power=%d, ta=%d)\n",
+		tx_power, ta);
+
+	/* Remove RLL header from msgb */
+	msgb_pull_l2h(msg);
+
+	/* Push L1 + LAPDm header on msgb */
+	msg->l2h = msgb_push(msg, 2 + 3);
+	msg->l2h[0] = tx_power;
+	msg->l2h[1] = ta;
+	msg->l2h[2] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.cmd);
+	msg->l2h[3] = LAPDm_CTRL_U(LAPDm_U_UI, 0);
+	msg->l2h[4] = LAPDm_LEN(length);
+	// FIXME: short L2 header support
+
+	/* Tramsmit */
+	return tx_ph_data_enqueue(dl, msg, chan_nr, link_id, n201);
+}
+
+/* L3 requests transfer of acknowledged information */
+static int rslms_rx_rll_data_req(struct msgb *msg, struct lapdm_datalink *dl)
+{
+	struct abis_rsl_rll_hdr *rllh = msgb_l2(msg);
+	struct tlv_parsed tv;
+
+	rsl_tlv_parse(&tv, rllh->data, msgb_l2len(msg)-sizeof(*rllh));
+	if (!TLVP_PRESENT(&tv, RSL_IE_L3_INFO)) {
+		LOGP(DLLAPDM, LOGL_ERROR, "data request without message "
+			"error\n");
+		msgb_free(msg);
+		return -EINVAL;
+	}
+	msg->l3h = TLVP_VAL(&tv, RSL_IE_L3_INFO);
+
+	LOGP(DLLAPDM, LOGL_INFO, "writing message to send-queue\n");
+
+	/* Remove the RSL/RLL header */
+	msgb_pull_l2h(msg);
+
+	/* Write data into the send queue */
+	msgb_enqueue(&dl->send_queue, msg);
+
+	/* Send message, if possible */
+	rslms_send_i(&dl->mctx, __LINE__);
+	return 0;
+}
+
+/* Send next I frame from queued/buffered data */
+static int rslms_send_i(struct lapdm_msg_ctx *mctx, int line)
+{
+	struct lapdm_datalink *dl = mctx->dl;
+	struct lapdm_entity *le = dl->entity;
+	uint8_t chan_nr = mctx->chan_nr;
+	uint8_t link_id = mctx->link_id;
+	uint8_t sapi = link_id & 7;
+	int k = k_sapi[sapi];
+	struct msgb *msg;
+	int length, left;
+	int rc = - 1; /* we sent nothing */
+
+	LOGP(DLLAPDM, LOGL_INFO, "%s() called from line %d\n", __func__, line);
+
+	next_frame:
+
+	if (dl->peer_busy) {
+		LOGP(DLLAPDM, LOGL_INFO, "peer busy, not sending\n");
+		return rc;
+	}
+
+	if (dl->state == LAPDm_STATE_TIMER_RECOV) {
+		LOGP(DLLAPDM, LOGL_INFO, "timer recovery, not sending\n");
+		return rc;
+	}
+
+	/* If the send state variable V(S) is equal to V(A) plus k
+	 * (where k is the maximum number of outstanding I frames - see
+	 * subclause 5.8.4), the data link layer entity shall not transmit any
+	 * new I frames, but shall retransmit an I frame as a result
+	 * of the error recovery procedures as described in subclauses 5.5.4 and
+	 * 5.5.7. */
+	if (dl->V_send == add_mod8(dl->V_ack, k)) {
+		LOGP(DLLAPDM, LOGL_INFO, "k frames outstanding, not sending "
+			"more (k=%u V(S)=%u V(A)=%u)\n", k, dl->V_send,
+			dl->V_ack);
+		return rc;
+	}
+
+	/* if we have no tx_hist yet, we create it */
+	if (!dl->tx_length[dl->V_send]) {
+		/* Get next message into send-buffer, if any */
+		if (!dl->send_buffer) {
+			next_message:
+			dl->send_out = 0;
+			dl->send_buffer = msgb_dequeue(&dl->send_queue);
+			/* No more data to be sent */
+			if (!dl->send_buffer)
+				return rc;
+			LOGP(DLLAPDM, LOGL_INFO, "get message from "
+				"send-queue\n");
+		}
+
+		/* How much is left in the send-buffer? */
+		left = msgb_l3len(dl->send_buffer) - dl->send_out;
+		/* Segment, if data exceeds N201 */
+		length = left;
+		if (length > mctx->n201 - 3)
+			length = mctx->n201 - 3;
+		LOGP(DLLAPDM, LOGL_INFO, "msg-len %d sent %d left %d N201 %d "
+			"length %d first byte %02x\n",
+			msgb_l3len(dl->send_buffer), dl->send_out, left,
+			mctx->n201, length, dl->send_buffer->l3h[0]);
+		/* If message in send-buffer is completely sent */
+		if (left == 0) {
+			msgb_free(dl->send_buffer);
+			dl->send_buffer = NULL;
+			goto next_message;
+		}
+
+		LOGP(DLLAPDM, LOGL_INFO, "send I frame %sV(S)=%d\n",
+			(left > length) ? "segment " : "", dl->V_send);
+
+		/* Create I frame (segment) and transmit-buffer content */
+		msg = msgb_alloc_headroom(23+10, 10, "LAPDm I");
+		msg->l2h = msgb_put(msg, 3 + length);
+		msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.cmd);
+		msg->l2h[1] = LAPDm_CTRL_I(dl->V_recv, dl->V_send, 0);
+		msg->l2h[2] = LAPDm_LEN(length);
+		if (left > length)
+			msg->l2h[2] |= LAPDm_MORE;
+		memcpy(msg->l2h + 3, dl->send_buffer->l3h + dl->send_out,
+			length);
+		memcpy(dl->tx_hist[dl->V_send], msg->l2h, 3 + length);
+		dl->tx_length[dl->V_send] = 3 + length;
+		/* Add length to track how much is already in the tx buffer */
+		dl->send_out += length;
+	} else {
+		LOGP(DLLAPDM, LOGL_INFO, "resend I frame from tx buffer "
+			"V(S)=%d\n", dl->V_send);
+
+		/* Create I frame (segment) from tx_hist */
+		length = dl->tx_length[dl->V_send];
+		msg = msgb_alloc_headroom(23+10, 10, "LAPDm I");
+		msg->l2h = msgb_put(msg, length);
+		memcpy(msg->l2h, dl->tx_hist[dl->V_send], length);
+		msg->l2h[1] = LAPDm_CTRL_I(dl->V_recv, dl->V_send, 0);
+	}
+
+	/* The value of the send state variable V(S) shall be incremented by 1
+	 * at the end of the transmission of the I frame */
+	dl->V_send = inc_mod8(dl->V_send);
+
+	/* If timer T200 is not running at the time right before transmitting a
+	 * frame, when the PH-READY-TO-SEND primitive is received from the
+	 * physical layer., it shall be set. */
+	if (!osmo_timer_pending(&dl->t200))
+		osmo_timer_schedule(&dl->t200, T200);
+
+	tx_ph_data_enqueue(dl, msg, chan_nr, link_id, mctx->n201);
+
+	rc = 0; /* we sent something */
+	goto next_frame;
+}
+
+/* L3 requests suspension of data link */
+static int rslms_rx_rll_susp_req(struct msgb *msg, struct lapdm_datalink *dl)
+{
+	struct abis_rsl_rll_hdr *rllh = msgb_l2(msg);
+	uint8_t sapi = rllh->link_id & 7;
+
+	if (sapi != 0) {
+		LOGP(DLLAPDM, LOGL_ERROR, "SAPI != 0 while suspending\n");
+		msgb_free(msg);
+		return -EINVAL;
+	}
+
+	LOGP(DLLAPDM, LOGL_INFO, "perform suspension\n");
+
+	/* put back the send-buffer to the send-queue (first position) */
+	if (dl->send_buffer) {
+		LOGP(DLLAPDM, LOGL_INFO, "put frame in sendbuffer back to "
+			"queue\n");
+		llist_add(&dl->send_buffer->list, &dl->send_queue);
+		dl->send_buffer = NULL;
+	} else
+		LOGP(DLLAPDM, LOGL_INFO, "no frame in sendbuffer\n");
+
+	/* Clear transmit buffer, but keep send buffer */
+	lapdm_dl_flush_tx(dl);
+
+	msgb_free(msg);
+
+	return send_rll_simple(RSL_MT_SUSP_CONF, &dl->mctx);
+}
+
+/* L3 requests resume of data link */
+static int rslms_rx_rll_res_req(struct msgb *msg, struct lapdm_datalink *dl)
+{
+	struct lapdm_entity *le = dl->entity;
+	struct abis_rsl_rll_hdr *rllh = msgb_l2(msg);
+	uint8_t chan_nr = rllh->chan_nr;
+	uint8_t link_id = rllh->link_id;
+	uint8_t sapi = rllh->link_id & 7;
+	struct tlv_parsed tv;
+	uint8_t length;
+	uint8_t n201 = 23; //FIXME
+
+	/* Set chan_nr and link_id for established connection */
+	memset(&dl->mctx, 0, sizeof(dl->mctx));
+	dl->mctx.dl = dl;
+	dl->mctx.n201 = n201;
+	dl->mctx.chan_nr = chan_nr;
+	dl->mctx.link_id = link_id;
+
+	rsl_tlv_parse(&tv, rllh->data, msgb_l2len(msg)-sizeof(*rllh));
+	if (!TLVP_PRESENT(&tv, RSL_IE_L3_INFO)) {
+		LOGP(DLLAPDM, LOGL_ERROR, "resume without message error\n");
+		msgb_free(msg);
+		return send_rll_simple(RSL_MT_REL_IND, &dl->mctx);
+	}
+	length = TLVP_LEN(&tv, RSL_IE_L3_INFO);
+
+	LOGP(DLLAPDM, LOGL_INFO, "perform re-establishment (SABM) length=%d\n",
+		length);
+	
+	/* Replace message in the send-buffer (reconnect) */
+	if (dl->send_buffer)
+		msgb_free(dl->send_buffer);
+	dl->send_out = 0;
+	if (length) {
+		/* Remove the RSL/RLL header */
+		msgb_pull_l2h(msg);
+		/* Write data into the send buffer, to be sent first */
+		dl->send_buffer = msg;
+	}
+
+	/* Discard partly received L3 message */
+	if (dl->rcv_buffer) {
+		msgb_free(dl->rcv_buffer);
+		dl->rcv_buffer = NULL;
+	}
+
+	/* Create new msgb (old one is now free) */
+	msg = msgb_alloc_headroom(23+10, 10, "LAPDm SABM");
+	msg->l2h = msgb_put(msg, 3);
+	msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.cmd);
+	msg->l2h[1] = LAPDm_CTRL_U(LAPDm_U_SABM, 1);
+	msg->l2h[2] = LAPDm_LEN(0);
+	/* Transmit-buffer carries exactly one segment */
+	memcpy(dl->tx_hist[0], msg->l2h, 3);
+	dl->tx_length[0] = 3;
+	/* set Vs to 0, because it is used as index when resending SABM */
+	dl->V_send = 0;
+
+	/* Set states */
+	dl->own_busy = dl->peer_busy = 0;
+	dl->retrans_ctr = 0;
+	lapdm_dl_newstate(dl, LAPDm_STATE_SABM_SENT);
+
+	/* Tramsmit and start T200 */
+	osmo_timer_schedule(&dl->t200, T200);
+	return tx_ph_data_enqueue(dl, msg, chan_nr, link_id, n201);
+}
+
+/* L3 requests release of data link */
+static int rslms_rx_rll_rel_req(struct msgb *msg, struct lapdm_datalink *dl)
+{
+	struct lapdm_entity *le = dl->entity;
+	struct abis_rsl_rll_hdr *rllh = msgb_l2(msg);
+	uint8_t chan_nr = rllh->chan_nr;
+	uint8_t link_id = rllh->link_id;
+	uint8_t sapi = rllh->link_id & 7;
+	uint8_t mode = 0;
+
+	/* get release mode */
+	if (rllh->data[0] == RSL_IE_RELEASE_MODE)
+		mode = rllh->data[1] & 1;
+
+	/* local release */
+	if (mode) {
+		LOGP(DLLAPDM, LOGL_INFO, "perform local release\n");
+		msgb_free(msg);
+		/* reset Timer T200 */
+		osmo_timer_del(&dl->t200);
+		/* enter idle state */
+		lapdm_dl_newstate(dl, LAPDm_STATE_IDLE);
+		/* flush buffers */
+		lapdm_dl_flush_tx(dl);
+		lapdm_dl_flush_send(dl);
+		/* send notification to L3 */
+		return send_rll_simple(RSL_MT_REL_CONF, &dl->mctx);
+	}
+
+	/* in case we are already disconnecting */
+	if (dl->state == LAPDm_STATE_DISC_SENT)
+		return -EBUSY;
+
+	LOGP(DLLAPDM, LOGL_INFO, "perform normal release (DISC)\n");
+
+	/* Pull rllh */
+	msgb_pull(msg, msg->tail - msg->l2h);
+
+	/* Push LAPDm header on msgb */
+	msg->l2h = msgb_push(msg, 3);
+	msg->l2h[0] = LAPDm_ADDR(LAPDm_LPD_NORMAL, sapi, le->cr.loc2rem.cmd);
+	msg->l2h[1] = LAPDm_CTRL_U(LAPDm_U_DISC, 1);
+	msg->l2h[2] = LAPDm_LEN(0);
+	/* Transmit-buffer carries exactly one segment */
+	memcpy(dl->tx_hist[0], msg->l2h, 3);
+	dl->tx_length[0] = 3;
+	
+	/* Set states */
+	dl->own_busy = dl->peer_busy = 0;
+	dl->retrans_ctr = 0;
+	lapdm_dl_newstate(dl, LAPDm_STATE_DISC_SENT);
+
+	/* Tramsmit and start T200 */
+	osmo_timer_schedule(&dl->t200, T200);
+	return tx_ph_data_enqueue(dl, msg, chan_nr, link_id, dl->mctx.n201);
+}
+
+/* L3 requests release in idle state */
+static int rslms_rx_rll_rel_req_idle(struct msgb *msg, struct lapdm_datalink *dl)
+{
+	msgb_free(msg);
+
+	/* send notification to L3 */
+	return send_rll_simple(RSL_MT_REL_CONF, &dl->mctx);
+}
+
+/* L3 requests channel in idle state */
+static int rslms_rx_chan_rqd(struct lapdm_channel *lc, struct msgb *msg)
+{
+	struct abis_rsl_cchan_hdr *cch = msgb_l2(msg);
+	void *l1ctx = lc->lapdm_dcch.l1_ctx;
+	struct osmo_phsap_prim pp;
+
+	osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_RACH,
+			PRIM_OP_REQUEST, NULL);
+
+	if (msgb_l2len(msg) < sizeof(*cch) + 4 + 2 + 2) {
+		LOGP(DLLAPDM, LOGL_ERROR, "Message too short for CHAN RQD!\n");
+		return -EINVAL;
+	}
+	if (cch->data[0] != RSL_IE_REQ_REFERENCE) {
+		LOGP(DLLAPDM, LOGL_ERROR, "Missing REQ REFERENCE IE\n");
+		return -EINVAL;
+	}
+	pp.u.rach_req.ra = cch->data[1];
+	pp.u.rach_req.offset = ((cch->data[2] & 0x7f) << 8) | cch->data[3];
+	pp.u.rach_req.is_combined_ccch = cch->data[2] >> 7;
+
+	if (cch->data[4] != RSL_IE_ACCESS_DELAY) {
+		LOGP(DLLAPDM, LOGL_ERROR, "Missing ACCESS_DELAY IE\n");
+		return -EINVAL;
+	}
+	/* TA = 0 - delay */
+	pp.u.rach_req.ta = 0 - cch->data[5];
+
+	if (cch->data[6] != RSL_IE_MS_POWER) {
+		LOGP(DLLAPDM, LOGL_ERROR, "Missing MS POWER IE\n");
+		return -EINVAL;
+	}
+	pp.u.rach_req.tx_power = cch->data[7];
+
+	msgb_free(msg);
+
+	return lc->lapdm_dcch.l1_prim_cb(&pp.oph, l1ctx);
+}
+
+/* L1 confirms channel request */
+static int l2_ph_chan_conf(struct msgb *msg, struct lapdm_entity *le, uint32_t frame_nr)
+{
+	struct abis_rsl_cchan_hdr *ch;
+	struct gsm_time tm;
+	struct gsm48_req_ref *ref;
+
+	gsm_fn2gsmtime(&tm, frame_nr);
+
+	msgb_pull_l2h(msg);
+	msg->l2h = msgb_push(msg, sizeof(*ch) + sizeof(*ref));
+	ch = (struct abis_rsl_cchan_hdr *)msg->l2h;
+	rsl_init_cchan_hdr(ch, RSL_MT_CHAN_CONF);
+	ch->chan_nr = RSL_CHAN_RACH;
+	ch->data[0] = RSL_IE_REQ_REFERENCE;
+	ref = (struct gsm48_req_ref *) (ch->data + 1);
+	ref->t1 = tm.t1;
+	ref->t2 = tm.t2;
+	ref->t3_low = tm.t3 & 0x7;
+	ref->t3_high = tm.t3 >> 3;
+	
+	return rslms_sendmsg(msg, le);
+}
+
+const char *lapdm_state_names[] = {
+	"LAPDm_STATE_NULL",
+	"LAPDm_STATE_IDLE",
+	"LAPDm_STATE_SABM_SENT",
+	"LAPDm_STATE_MF_EST",
+	"LAPDm_STATE_TIMER_RECOV",
+	"LAPDm_STATE_DISC_SENT",
+};
+
+/* statefull handling for RSLms RLL messages from L3 */
+static struct l2downstate {
+	uint32_t	states;
+	int		type;
+	int		(*rout) (struct msgb *msg, struct lapdm_datalink *dl);
+} l2downstatelist[] = {
+	/* create and send UI command */
+	{ALL_STATES,
+	 RSL_MT_UNIT_DATA_REQ, rslms_rx_rll_udata_req},
+
+	/* create and send SABM command */
+	{SBIT(LAPDm_STATE_IDLE),
+	 RSL_MT_EST_REQ, rslms_rx_rll_est_req},
+
+	/* create and send I command */
+	{SBIT(LAPDm_STATE_MF_EST) |
+	 SBIT(LAPDm_STATE_TIMER_RECOV),
+	 RSL_MT_DATA_REQ, rslms_rx_rll_data_req},
+
+	/* suspend datalink */
+	{SBIT(LAPDm_STATE_MF_EST) |
+	 SBIT(LAPDm_STATE_TIMER_RECOV),
+	 RSL_MT_SUSP_REQ, rslms_rx_rll_susp_req},
+
+	/* create and send SABM command (resume) */
+	{SBIT(LAPDm_STATE_MF_EST) |
+	 SBIT(LAPDm_STATE_TIMER_RECOV),
+	 RSL_MT_RES_REQ, rslms_rx_rll_res_req},
+
+	/* create and send SABM command (reconnect) */
+	{SBIT(LAPDm_STATE_IDLE) |
+	 SBIT(LAPDm_STATE_MF_EST) |
+	 SBIT(LAPDm_STATE_TIMER_RECOV),
+	 RSL_MT_RECON_REQ, rslms_rx_rll_res_req},
+
+	/* create and send DISC command */
+	{SBIT(LAPDm_STATE_SABM_SENT) |
+	 SBIT(LAPDm_STATE_MF_EST) |
+	 SBIT(LAPDm_STATE_TIMER_RECOV) |
+	 SBIT(LAPDm_STATE_DISC_SENT),
+	 RSL_MT_REL_REQ, rslms_rx_rll_rel_req},
+
+	/* release in idle state */
+	{SBIT(LAPDm_STATE_IDLE),
+	 RSL_MT_REL_REQ, rslms_rx_rll_rel_req_idle},
+};
+
+#define L2DOWNSLLEN \
+	(sizeof(l2downstatelist) / sizeof(struct l2downstate))
+
+/* incoming RSLms RLL message from L3 */
+static int rslms_rx_rll(struct msgb *msg, struct lapdm_channel *lc)
+{
+	struct abis_rsl_rll_hdr *rllh = msgb_l2(msg);
+	int msg_type = rllh->c.msg_type;
+	uint8_t sapi = rllh->link_id & 7;
+	struct lapdm_entity *le;
+	struct lapdm_datalink *dl;
+	int i, supported = 0;
+	int rc = 0;
+
+	if (msgb_l2len(msg) < sizeof(*rllh)) {
+		LOGP(DLLAPDM, LOGL_ERROR, "Message too short for RLL hdr!\n");
+		return -EINVAL;
+	}
+
+	if (rllh->link_id & 0x40)
+		le = &lc->lapdm_acch;
+	else
+		le = &lc->lapdm_dcch;
+
+	/* G.2.1 No action schall be taken on frames containing an unallocated
+	 * SAPI.
+	 */
+	dl = datalink_for_sapi(le, sapi);
+	if (!dl) {
+		LOGP(DLLAPDM, LOGL_ERROR, "No instance for SAPI %d!\n", sapi);
+		return -EINVAL;
+	}
+
+	LOGP(DLLAPDM, LOGL_INFO, "(%p) RLL Message '%s' received in state %s\n",
+		lc->name, rsl_msg_name(msg_type), lapdm_state_names[dl->state]);
+
+	/* find function for current state and message */
+	for (i = 0; i < L2DOWNSLLEN; i++) {
+		if (msg_type == l2downstatelist[i].type)
+			supported = 1;
+		if ((msg_type == l2downstatelist[i].type)
+		 && ((1 << dl->state) & l2downstatelist[i].states))
+			break;
+	}
+	if (!supported) {
+		LOGP(DLLAPDM, LOGL_NOTICE, "Message unsupported.\n");
+		msgb_free(msg);
+		return 0;
+	}
+	if (i == L2DOWNSLLEN) {
+		LOGP(DLLAPDM, LOGL_NOTICE, "Message unhandled at this state.\n");
+		msgb_free(msg);
+		return 0;
+	}
+
+	rc = l2downstatelist[i].rout(msg, dl);
+
+	return rc;
+}
+
+/* incoming RSLms COMMON CHANNEL message from L3 */
+static int rslms_rx_com_chan(struct msgb *msg, struct lapdm_channel *lc)
+{
+	struct abis_rsl_cchan_hdr *cch = msgb_l2(msg);
+	int msg_type = cch->c.msg_type;
+	int rc = 0;
+
+	if (msgb_l2len(msg) < sizeof(*cch)) {
+		LOGP(DLLAPDM, LOGL_ERROR, "Message too short for COM CHAN hdr!\n");
+		return -EINVAL;
+	}
+
+	switch (msg_type) {
+	case RSL_MT_CHAN_RQD:
+		/* create and send RACH request */
+		rc = rslms_rx_chan_rqd(lc, msg);
+		break;
+	default:
+		LOGP(DLLAPDM, LOGL_NOTICE, "Unknown COMMON CHANNEL msg %d!\n",
+			msg_type);
+		msgb_free(msg);
+		return 0;
+	}
+
+	return rc;
+}
+
+/* input into layer2 (from layer 3) */
+int lapdm_rslms_recvmsg(struct msgb *msg, struct lapdm_channel *lc)
+{
+	struct abis_rsl_common_hdr *rslh = msgb_l2(msg);
+	int rc = 0;
+
+	if (msgb_l2len(msg) < sizeof(*rslh)) {
+		LOGP(DLLAPDM, LOGL_ERROR, "Message too short RSL hdr!\n");
+		return -EINVAL;
+	}
+
+	switch (rslh->msg_discr & 0xfe) {
+	case ABIS_RSL_MDISC_RLL:
+		rc = rslms_rx_rll(msg, lc);
+		break;
+	case ABIS_RSL_MDISC_COM_CHAN:
+		rc = rslms_rx_com_chan(msg, lc);
+		break;
+	default:
+		LOGP(DLLAPDM, LOGL_ERROR, "unknown RSLms message "
+			"discriminator 0x%02x", rslh->msg_discr);
+		msgb_free(msg);
+		return -EINVAL;
+	}
+
+	return rc;
+}
+
+int lapdm_entity_set_mode(struct lapdm_entity *le, enum lapdm_mode mode)
+{
+	switch (mode) {
+	case LAPDM_MODE_MS:
+		le->cr.loc2rem.cmd = CR_MS2BS_CMD;
+		le->cr.loc2rem.resp = CR_MS2BS_RESP;
+		le->cr.rem2loc.cmd = CR_BS2MS_CMD;
+		le->cr.rem2loc.resp = CR_BS2MS_RESP;
+		break;
+	case LAPDM_MODE_BTS:
+		le->cr.loc2rem.cmd = CR_BS2MS_CMD;
+		le->cr.loc2rem.resp = CR_BS2MS_RESP;
+		le->cr.rem2loc.cmd = CR_MS2BS_CMD;
+		le->cr.rem2loc.resp = CR_MS2BS_RESP;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	le->mode = mode;
+
+	return 0;
+}
+
+int lapdm_channel_set_mode(struct lapdm_channel *lc, enum lapdm_mode mode)
+{
+	int rc;
+
+	rc = lapdm_entity_set_mode(&lc->lapdm_dcch, mode);
+	if (rc < 0)
+		return rc;
+
+	return lapdm_entity_set_mode(&lc->lapdm_acch, mode);
+}
+
+void lapdm_channel_set_l1(struct lapdm_channel *lc, osmo_prim_cb cb, void *ctx)
+{
+	lc->lapdm_dcch.l1_prim_cb = cb;
+	lc->lapdm_acch.l1_prim_cb = cb;
+	lc->lapdm_dcch.l1_ctx = ctx;
+	lc->lapdm_acch.l1_ctx = ctx;
+}
+
+void lapdm_channel_set_l3(struct lapdm_channel *lc, lapdm_cb_t cb, void *ctx)
+{
+	lc->lapdm_dcch.l3_cb = cb;
+	lc->lapdm_acch.l3_cb = cb;
+	lc->lapdm_dcch.l3_ctx = ctx;
+	lc->lapdm_acch.l3_ctx = ctx;
+}
+
+void lapdm_entity_reset(struct lapdm_entity *le)
+{
+	struct lapdm_datalink *dl;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(le->datalink); i++) {
+		dl = &le->datalink[i];
+		if (dl->state == LAPDm_STATE_IDLE)
+			continue;
+		LOGP(DLLAPDM, LOGL_INFO, "Resetting LAPDm instance\n");
+		/* reset Timer T200 */
+		osmo_timer_del(&dl->t200);
+		/* enter idle state */
+		dl->state = LAPDm_STATE_IDLE;
+		/* flush buffer */
+		lapdm_dl_flush_tx(dl);
+		lapdm_dl_flush_send(dl);
+	}
+}
+
+void lapdm_channel_reset(struct lapdm_channel *lc)
+{
+	lapdm_entity_reset(&lc->lapdm_dcch);
+	lapdm_entity_reset(&lc->lapdm_acch);
+}
+
+void lapdm_entity_set_flags(struct lapdm_entity *le, unsigned int flags)
+{
+	le->flags = flags;
+}
+
+void lapdm_channel_set_flags(struct lapdm_channel *lc, unsigned int flags)
+{
+	lapdm_entity_set_flags(&lc->lapdm_dcch, flags);
+	lapdm_entity_set_flags(&lc->lapdm_acch, flags);
+}
