
/*
 * 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},
};

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

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

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