
/*
 * minimal standalone network-side lap-d implementation
 * oystein@homelien.no, 2009
 */

#include <stdio.h>
#include <string.h>
#include <assert.h>

#include "lapd.h"
#include "openbsc/debug.h"

#define	DEBUG_LAPD(f, args...)	{ printf("lapd "); printf(f, ## args); };

typedef enum {
	LAPD_TEI_NONE = 0,

	LAPD_TEI_ASSIGNED,

	LAPD_TEI_ACTIVE,
} lapd_tei_state;

const char *lapd_tei_states[] = {
	"NONE",
	"ASSIGNED",
	"ACTIVE",
};

typedef enum {
	LAPD_TYPE_NONE = 0,

	LAPD_TYPE_I,
	LAPD_TYPE_S,
	LAPD_TYPE_U,
} lapd_msg_type;

typedef enum {
	/* commands/responses */
	LAPD_CMD_NONE = 0,

	LAPD_CMD_I,
	LAPD_CMD_RR,
	LAPD_CMD_RNR,
	LAPD_CMD_REJ,

	LAPD_CMD_SABME,
	LAPD_CMD_DM,
	LAPD_CMD_UI,
	LAPD_CMD_DISC,
	LAPD_CMD_UA,
	LAPD_CMD_FRMR,
	LAPD_CMD_XID,
} lapd_cmd_type;

const char *lapd_cmd_types[] = {
	"NONE",

	"I",
	"RR",
	"RNR",
	"REJ",

	"SABME",
	"DM",
	"UI",
	"DISC",
	"UA",
	"FRMR",
	"XID",

};

const char *lapd_msg_types = "?ISU";
const int network_side = 1;	/* 0 for user side */

typedef struct {
	int tei;
	int sapi;
	/* A valid N(R) value is one that is in the range V(A) ≤ N(R) ≤ V(S). */
	int vs;			/* next to be transmitted */
	int va;			/* last acked by peer */
	int vr;			/* next expected to be received */
	lapd_tei_state state;
} lapd_tei_t;

/* 3.5.2.2   Send state variable V(S)
 * Each point-to-point data link connection endpoint shall have an associated V(S) when using I frame
 * commands. V(S) denotes the sequence number of the next I frame to be transmitted. The V(S) can
 * take on the value 0 through n minus 1. The value of V(S) shall be incremented by 1 with each
 * successive I frame transmission, and shall not exceed V(A) by more than the maximum number of
 * outstanding I frames k. The value of k may be in the range of 1 ≤ k ≤ 127.
 *
 * 3.5.2.3   Acknowledge state variable V(A)
 * Each point-to-point data link connection endpoint shall have an associated V(A) when using I frame
 * commands and supervisory frame commands/responses. V(A) identifies the last I frame that has been
 * acknowledged by its peer [V(A) − 1 equals the N(S) of the last acknowledged I frame]. V(A) can
 * take on the value 0 through n minus 1. The value of V(A) shall be updated by the valid N(R) values
 * received from its peer (see 3.5.2.6). A valid N(R) value is one that is in the range V(A) ≤ N(R) ≤
 * V(S).
 *
 * 3.5.2.5    Receive state variable V(R)
 * Each point-to-point data link connection endpoint shall have an associated V(R) when using I frame
 * commands and supervisory frame commands/responses. V(R) denotes the sequence number of the
 * next in-sequence I frame expected to be received. V(R) can take on the value 0 through n minus 1.
 * The value of V(R) shall be incremented by one with the receipt of an error-free, in-sequence I frame
 * whose N(S) equals V(R).
 */
#define	LAPD_NS(teip) (teip->vs)
#define	LAPD_NR(teip) (teip->vr)

/* 3.5.2.4    Send sequence number N(S)
 * Only I frames contain N(S), the send sequence number of transmitted I frames. At the time that an in-
 * sequence I frame is designated for transmission, the value of N(S) is set equal to V(S).
 *
 * 3.5.2.6    Receive sequence number N(R)
 * All I frames and supervisory frames contain N(R), the expected send sequence number of the next
 * received I frame. At the time that a frame of the above types is designated for transmission, the value
 * of N(R) is set equal to V(R). N(R) indicates that the data link layer entity transmitting the N(R) has
 * correctly received all I frames numbered up to and including N(R) − 1.
 */
void (*lapd_transmit_cb) (uint8_t * data, int len, void *cbdata);

static lapd_tei_t tei_list[] = {
	{25, 62,},
	{1, 0,},
	{-1},
};

static lapd_tei_t *teip_from_tei(int tei)
{
	lapd_tei_t *p;
	for (p = tei_list; p->tei != -1; p++) {
		if (p->tei == tei)
			return p;
	};
	return NULL;
};

static void lapd_tei_set_state(lapd_tei_t * teip, int newstate)
{
	DEBUG_LAPD("state change on tei %d: %s -> %s\n", teip->tei,
		   lapd_tei_states[teip->state], lapd_tei_states[newstate]);
	teip->state = newstate;
};

static void lapd_tei_receive(uint8_t * data, int len, void *cbdata)
{
	//DEBUG_LAPD("tei receive %p, %d\n", data, len);
	int entity = data[0];
	int ref = data[1];
	int mt = data[3];
	int action = data[4] >> 1;
	int e = data[4] & 1;
	//DEBUG_LAPD("tei mgmt: entity %x, ref %x, mt %x, action %x, e %x\n", entity, ref, mt, action, e);

	switch (mt) {
	case 0x01:{		// identity request
			int tei = action;
			DEBUG_LAPD
			    ("tei mgmt: identity request, accepting tei %d\n",
			     tei);
			//printf("tei: %d\n", tei);
			uint8_t resp[8];
			memmove(resp, "\xfe\xff\x03\x0f\x00\x00\x02\x00", 8);
			resp[7] = (tei << 1) | 1;
			lapd_transmit_cb(resp, 8, cbdata);
			lapd_tei_t *teip = teip_from_tei(tei);
			if (teip->state == LAPD_TEI_NONE)
				lapd_tei_set_state(teip, LAPD_TEI_ASSIGNED);
			break;
		}
	default:
		DEBUG_LAPD("tei mgmt: unknown mt %x action %x\n", mt, action);
		assert(0);
	};
};

uint8_t *lapd_receive(uint8_t * data, int len, int *ilen, lapd_mph_type * prim,
		      void *cbdata)
{
#if 0
	DEBUG_LAPD("receive %p, %d\n", data, len);
	hexdump(data, len);
#endif

	*ilen = 0;
	*prim = 0;

	if (len < 2) {
		DEBUG_LAPD("len %d < 2\n", len);
		return NULL;
	};

	if ((data[0] & 1) != 0 || (data[1] & 1) != 1) {
		DEBUG_LAPD("address field %x/%x not well formed\n", data[0],
			   data[1]);
		return NULL;
	};

	int sapi = data[0] >> 2;
	int cr = (data[0] >> 1) & 1;
	int tei = data[1] >> 1;
	int command = network_side ^ cr;
	//DEBUG_LAPD("  address sapi %x tei %d cmd %d cr %d\n", sapi, tei, command, cr);

	if (len < 3) {
		DEBUG_LAPD("len %d < 3\n", len);
		return NULL;
	};

	lapd_msg_type typ = 0;
	lapd_cmd_type cmd = 0;
	int pf = -1;
	int ns = -1;
	int nr = -1;
	if ((data[2] & 1) == 0) {
		typ = LAPD_TYPE_I;
		assert(len >= 4);
		ns = data[2] >> 1;
		nr = data[3] >> 1;
		pf = data[3] & 1;
		cmd = LAPD_CMD_I;
	} else if ((data[2] & 3) == 1) {
		typ = LAPD_TYPE_S;
		assert(len >= 4);
		nr = data[3] >> 1;
		pf = data[3] & 1;
		switch (data[2]) {
		case 0x1:
			cmd = LAPD_CMD_RR;
			break;
		case 0x5:
			cmd = LAPD_CMD_RNR;
			break;
		case 0x9:
			cmd = LAPD_CMD_REJ;
			break;
		default:
			DEBUG_LAPD("unknown S cmd %x\n", data[2]);
			assert(0);
		};
	} else if ((data[2] & 3) == 3) {
		typ = LAPD_TYPE_U;
		pf = (data[2] >> 4) & 1;
		int val = data[2] & ~(1 << 4);
		switch (val) {
		case 0x6f:
			cmd = LAPD_CMD_SABME;
			break;
		case 0x0f:
			cmd = LAPD_CMD_DM;
			break;
		case 0x03:
			cmd = LAPD_CMD_UI;
			break;
		case 0x43:
			cmd = LAPD_CMD_DISC;
			break;
		case 0x63:
			cmd = LAPD_CMD_UA;
			break;
		case 0x87:
			cmd = LAPD_CMD_FRMR;
			break;
		case 0xaf:
			cmd = LAPD_CMD_XID;
			break;

		default:
			DEBUG_LAPD("unknown U cmd %x (pf %x data %x)\n", val,
				   pf, data[2]);
			assert(0);
		};
	};

	uint8_t *contents = &data[4];
	if (typ == LAPD_TYPE_U)
		contents--;
	*ilen = len - (contents - data);

	lapd_tei_t *teip = teip_from_tei(tei);
	if (tei == 127)
		lapd_tei_receive(contents, *ilen, cbdata);

	DEBUG_LAPD
	    ("<- %c %s sapi %x tei %3d cmd %x pf %x ns %3d nr %3d ilen %d teip %p vs %d va %d vr %d len %d\n",
	     lapd_msg_types[typ], lapd_cmd_types[cmd], sapi, tei, command, pf,
	     ns, nr, *ilen, teip, teip ? teip->vs : -1, teip ? teip->va : -1,
	     teip ? teip->vr : -1, len);

	if (teip) {
		switch (cmd) {
		case LAPD_CMD_I:{
				if (ns != teip->vr) {
					DEBUG_LAPD("ns %d != vr %d\n", ns,
						   teip->vr);
					if (ns == ((teip->vr - 1) & 0x7f)) {
						DEBUG_LAPD
						    ("DOUBLE FRAME, ignoring\n");
						cmd = 0;	// ignore
					} else {
						assert(0);
					};
				} else {
					//printf("IN SEQUENCE\n");
					teip->vr = (ns + 1) & 0x7f;	// FIXME: hack!
				};

				break;
			}
		case LAPD_CMD_UI:
			break;
		case LAPD_CMD_SABME:{
				teip->vs = 0;
				teip->vr = 0;
				teip->va = 0;

				// ua
				uint8_t resp[8];
				int l = 0;
				resp[l++] = data[0];
				resp[l++] = (tei << 1) | 1;
				resp[l++] = 0x73;
				lapd_transmit_cb(resp, l, cbdata);
				if (teip->state != LAPD_TEI_ACTIVE) {
					if (teip->state == LAPD_TEI_ASSIGNED) {
						lapd_tei_set_state(teip,
								   LAPD_TEI_ACTIVE);
						//printf("ASSIGNED and ACTIVE\n");
					} else {
#if 0
						DEBUG_LAPD
						    ("rr in strange state, send rej\n");

						// rej
						uint8_t resp[8];
						int l = 0;
						resp[l++] =
						    (teip->
						     sapi << 2) | (network_side
								   ? 0 : 2);
						resp[l++] = (tei << 1) | 1;
						resp[l++] = 0x09;	//rej
						resp[l++] =
						    ((teip->vr + 1) << 1) | 0;
						lapd_transmit_cb(resp, l,
								 cbdata);
						pf = 0;	// dont reply
#endif
					};
				};

				*prim = LAPD_MPH_ACTIVATE_IND;
				break;
			}
		case LAPD_CMD_RR:{
				teip->va = (nr & 0x7f);
#if 0
				if (teip->state != LAPD_TEI_ACTIVE) {
					if (teip->state == LAPD_TEI_ASSIGNED) {
						lapd_tei_set_state(teip,
								   LAPD_TEI_ACTIVE);
						*prim = LAPD_MPH_ACTIVATE_IND;
						//printf("ASSIGNED and ACTIVE\n");
					} else {
#if 0
						DEBUG_LAPD
						    ("rr in strange state, send rej\n");

						// rej
						uint8_t resp[8];
						int l = 0;
						resp[l++] =
						    (teip->
						     sapi << 2) | (network_side
								   ? 0 : 2);
						resp[l++] = (tei << 1) | 1;
						resp[l++] = 0x09;	//rej
						resp[l++] =
						    ((teip->vr + 1) << 1) | 0;
						lapd_transmit_cb(resp, l,
								 cbdata);
						pf = 0;	// dont reply
#endif
					};
				};
#endif
				if (pf) {
					// interrogating us, send rr
					uint8_t resp[8];
					int l = 0;
					resp[l++] = data[0];
					resp[l++] = (tei << 1) | 1;
					resp[l++] = 0x01;	// rr
					resp[l++] = (LAPD_NR(teip) << 1) | (data[3] & 1);	// pf bit from req

					lapd_transmit_cb(resp, l, cbdata);

				};

				break;
			}
		case LAPD_CMD_FRMR:{
				// frame reject
#if 0
				if (teip->state == LAPD_TEI_ACTIVE)
					*prim = LAPD_MPH_DEACTIVATE_IND;
				lapd_tei_set_state(teip, LAPD_TEI_ASSIGNED);
#endif
				DEBUG_LAPD("frame reject, ignoring\n");
				assert(0);
				break;
			}
		case LAPD_CMD_DISC:{
				// disconnect
				uint8_t resp[8];
				int l = 0;
				resp[l++] = data[0];
				resp[l++] = (tei << 1) | 1;
				resp[l++] = 0x73;
				lapd_transmit_cb(resp, l, cbdata);
				lapd_tei_set_state(teip, LAPD_TEI_NONE);
				break;
			}
		default:
			DEBUG_LAPD("unknown cmd for tei %d (cmd %x)\n", tei,
				   cmd);
			assert(0);
		};
	};

	//if ((*prim == 0) && (ilen > 0) && (typ != LAPD_TYPE_S)) {
	//if (cmd == LAPD_CMD_I) {
	if (typ == LAPD_TYPE_I) {
		// send rr
		// Thu Jan 22 19:17:13 2009 <4000> sangoma.c:340 read  (62/25)   4: fa 33 01 0a 
		// lapd <- S RR sapi 3e tei  25 cmd 0 pf 0 ns  -1 nr   5 ilen 0 teip 0x613800 vs 7 va 5 vr 2 len 4

		// interrogating us, send rr
		DEBUG_LAPD("Sending RR response\n");
		uint8_t resp[8];
		int l = 0;
		resp[l++] = data[0];
		resp[l++] = (tei << 1) | 1;
		resp[l++] = 0x01;	// rr
		resp[l++] = (LAPD_NR(teip) << 1) | (data[3] & 1);	// pf bit from req

		lapd_transmit_cb(resp, l, cbdata);

		if (cmd != 0) {
			*prim = LAPD_DL_DATA_IND;
			return contents;
		}
	} else if (tei != 127 && typ == LAPD_TYPE_U && cmd == LAPD_CMD_UI) {
		*prim = LAPD_DL_UNITDATA_IND;
		return contents;
	}

	return NULL;
};

void lapd_transmit(int tei, uint8_t * data, int len, void *cbdata)
{
	//printf("lapd_transmit %d, %d\n", tei, len);
	//hexdump(data, len);
	lapd_tei_t *teip = teip_from_tei(tei);
	//printf("teip %p\n", teip);

	// prepend stuff
	uint8_t buf[10000];
	memset(buf, 0, sizeof(buf));
	memmove(buf + 4, data, len);
	len += 4;

	buf[0] = (teip->sapi << 2) | (network_side ? 2 : 0);
	buf[1] = (teip->tei << 1) | 1;
	buf[2] = (LAPD_NS(teip) << 1);
	buf[3] = (LAPD_NR(teip) << 1) | 0;

	teip->vs = (teip->vs + 1) & 0x7f;

	lapd_transmit_cb(buf, len, cbdata);
};
