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);
+}
