/* OpenBSC Abis interface to mISDNuser */

/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
 * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
 *
 * 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.
 *
 */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <sys/fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <mISDNif.h>

//#define AF_COMPATIBILITY_FUNC
//#include <compat_af_isdn.h>
#define AF_ISDN 34
#define PF_ISDN AF_ISDN

#include <openbsc/select.h>
#include <openbsc/msgb.h>
#include <openbsc/debug.h>
#include <openbsc/gsm_data.h>
#include <openbsc/abis_nm.h>
#include <openbsc/abis_rsl.h>

#define NUM_E1_TS	32


/*
 * pcap writing of the misdn load
 * pcap format is from http://wiki.wireshark.org/Development/LibpcapFileFormat
 */
#define DLT_LINUX_LAPD		177
#define PCAP_INPUT		0
#define PCAP_OUTPUT		1

struct pcap_hdr {
	u_int32_t magic_number;
	u_int16_t version_major;
	u_int16_t version_minor;
	int32_t  thiszone;
	u_int32_t sigfigs;
	u_int32_t snaplen;
	u_int32_t network;
} __attribute__((packed));

struct pcaprec_hdr {
	u_int32_t ts_sec;
	u_int32_t ts_usec;
	u_int32_t incl_len;
	u_int32_t orig_len;
} __attribute__((packed));

struct fake_linux_lapd_header {
        u_int16_t pkttype;
	u_int16_t hatype;
	u_int16_t halen;
	u_int64_t addr;
	int16_t protocol;
} __attribute__((packed));

struct lapd_header {
	u_int8_t ea1 : 1;
	u_int8_t cr : 1;
	u_int8_t sapi : 6;
	u_int8_t ea2 : 1;
	u_int8_t tei : 7;
	u_int8_t control_foo; /* fake UM's ... */
} __attribute__((packed));

static_assert((int)&((struct fake_linux_lapd_header*)NULL)->hatype == 2,	hatype_offset);
static_assert((int)&((struct fake_linux_lapd_header*)NULL)->halen == 4,		halen_offset);
static_assert((int)&((struct fake_linux_lapd_header*)NULL)->addr == 6,		addr_offset);
static_assert((int)&((struct fake_linux_lapd_header*)NULL)->protocol == 14,	proto_offset);
static_assert(sizeof(struct fake_linux_lapd_header) == 16,			lapd_header_size);


static int pcap_fd = -1;

void mi_set_pcap_fd(int fd)
{
	int ret;
	struct pcap_hdr header = {
		.magic_number	= 0xa1b2c3d4,
		.version_major	= 2,
		.version_minor	= 4,
		.thiszone	= 0,
		.sigfigs	= 0,
		.snaplen	= 65535,
		.network	= DLT_LINUX_LAPD,
	};

	pcap_fd = fd;
	ret = write(pcap_fd, &header, sizeof(header));
}

/* This currently only works for the D-Channel */
static void write_pcap_packet(int direction, struct sockaddr_mISDN* addr,
			      struct msgb *msg) {
	if (pcap_fd < 0)
		return;

	int ret;
	time_t cur_time;
	struct tm *tm;

	struct fake_linux_lapd_header header = {
		.pkttype	= 4,
		.hatype		= 0,
		.halen		= 0,
		.addr		= direction == PCAP_OUTPUT ? 0x0 : 0x1,
		.protocol	= ntohs(48),
	};

	struct lapd_header lapd_header = {
		.ea1		= 0,
		.cr		= direction == PCAP_OUTPUT ? 1 : 0,
		.sapi		= addr->sapi & 0x3F,
		.ea2		= 1,
		.tei		= addr->tei & 0x7F,
		.control_foo	= 0x13 /* UI with P set */,
	};	

	struct pcaprec_hdr payload_header = {
		.ts_sec	    = 0,
		.ts_usec    = 0,
		.incl_len   = msg->len + sizeof(struct fake_linux_lapd_header)
				+ sizeof(struct lapd_header)
				- MISDN_HEADER_LEN,
		.orig_len   = msg->len + sizeof(struct fake_linux_lapd_header)
				+ sizeof(struct lapd_header)
				- MISDN_HEADER_LEN,
	};


	cur_time = time(NULL);
	tm = localtime(&cur_time);
	payload_header.ts_sec = mktime(tm);

	ret = write(pcap_fd, &payload_header, sizeof(payload_header));
	ret = write(pcap_fd, &header, sizeof(header));
	ret = write(pcap_fd, &lapd_header, sizeof(lapd_header));
	ret = write(pcap_fd, msg->data + MISDN_HEADER_LEN,
			msg->len - MISDN_HEADER_LEN);
}

/* data structure for one E1 interface with A-bis */
struct mi_e1_handle {
	struct gsm_bts *bts;
	/* The mISDN card number of the card we use */
	int cardnr;
	/* The RSL adress */
	struct sockaddr_mISDN l2addr;
	/* The OML adress */
	struct sockaddr_mISDN omladdr;
	/* list (queue) of to-be-sent msgb's */
	struct llist_head rsl_tx_list;
	struct llist_head oml_tx_list;

	void (*cb)(int event, struct gsm_bts *bts);
	struct bsc_fd fd[NUM_E1_TS];

	int ts2_fd;
};

/* FIXME: this needs to go */
static struct mi_e1_handle *global_e1h;

#define SAPI_L2ML	0
#define SAPI_OML	62
#define SAPI_RSL	0	/* 63 ? */

#define TEI_L2ML	127
#define TEI_OML		25
#define TEI_RSL		1

void hexdump(unsigned char *buf, int len)
{
	int i;
	for (i = 0; i < len; i++) {
		fprintf(stdout, "%02x ", buf[i]);
	}
	fprintf(stdout, "\n");
}

#define TS1_ALLOC_SIZE	300

static int handle_ts1_read(struct bsc_fd *bfd)
{
	struct mi_e1_handle *e1h = bfd->data;
	struct msgb *msg = msgb_alloc(TS1_ALLOC_SIZE);
	struct sockaddr_mISDN l2addr;
	struct mISDNhead *hh;
	socklen_t alen;
	int ret;

	if (!msg)
		return -ENOMEM;

	hh = (struct mISDNhead *) msg->data;

	/* FIXME: Map TEI/SAPI to TRX */
	msg->trx = e1h->bts->c0;

	alen = sizeof(l2addr);
	ret = recvfrom(bfd->fd, msg->data, 300, 0,
		       (struct sockaddr *) &l2addr, &alen);
	if (ret < 0) {
		fprintf(stderr, "recvfrom error  %s\n", strerror(errno));
		return ret;
	}

	if (alen != sizeof(l2addr))
		return -EINVAL;

	msgb_put(msg, ret);

	DEBUGP(DMI, "alen =%d, dev(%d) channel(%d) sapi(%d) tei(%d)\n",
		alen, l2addr.dev, l2addr.channel, l2addr.sapi, l2addr.tei);

	DEBUGP(DMI, "<= len = %d, prim(0x%x) id(0x%x)\n",
		ret, hh->prim, hh->id);


	switch (hh->prim) {
	case DL_INFORMATION_IND:
		DEBUGP(DMI, "got DL_INFORMATION_IND\n");
		struct sockaddr_mISDN *sa = NULL;
		char *lstr = "UNKN";

		switch (l2addr.tei) {
		case TEI_OML:
			sa = &e1h->omladdr;
			lstr = "OML";
			break;
		case TEI_RSL:
			sa = &e1h->l2addr;
			lstr = "RSL";
			break;
		default:
			break;
		}
		if (sa) {
			DEBUGP(DMI, "%s use channel(%d) sapi(%d) tei(%d) for now\n",
				lstr, l2addr.channel, l2addr.sapi, l2addr.tei);
			memcpy(sa, &l2addr, sizeof(l2addr));
		}
		break;
	case DL_ESTABLISH_IND:
		DEBUGP(DMI, "got DL_ESTABLISH_IND\n");
		break;
	case DL_ESTABLISH_CNF:
		DEBUGP(DMI, "got DL_ESTABLISH_CNF\n");
		break;
	case DL_RELEASE_IND:
		DEBUGP(DMI, "got DL_RELEASE_IND: E1 Layer 1 disappeared?\n");
		break;
	case MPH_ACTIVATE_IND:
		DEBUGP(DMI, "got MPH_ACTIVATE_IND\n");
		if (l2addr.tei == TEI_OML && l2addr.sapi == SAPI_OML)
			e1h->cb(EVT_E1_OML_UP, e1h->bts);
		else if (l2addr.tei == TEI_RSL && l2addr.sapi == SAPI_RSL)
			e1h->cb(EVT_E1_RSL_UP, e1h->bts);
		break;
	case MPH_DEACTIVATE_IND:
		DEBUGP(DMI, "got MPH_DEACTIVATE_IND: TEI link closed?\n");
		if (l2addr.tei == TEI_OML && l2addr.sapi == SAPI_OML)
			e1h->cb(EVT_E1_OML_DN, e1h->bts);
		else if (l2addr.tei == TEI_RSL && l2addr.sapi == SAPI_RSL)
			e1h->cb(EVT_E1_RSL_DN, e1h->bts);
		break;
	case DL_DATA_IND:
		DEBUGP(DMI, "got DL_DATA_IND\n");
		write_pcap_packet(PCAP_INPUT, &l2addr, msg);

		msg->l2h = msg->data + MISDN_HEADER_LEN;
		
		if (debug_mask & DMI) { 
			fprintf(stdout, "RX: ");
			hexdump(msgb_l2(msg), ret - MISDN_HEADER_LEN);
		}
		switch (l2addr.tei) {
		case TEI_OML:
			ret = abis_nm_rcvmsg(msg);
			break;
		case TEI_RSL:
			ret = abis_rsl_rcvmsg(msg);
			break;
		default:
			fprintf(stderr, "DATA_IND for unknown TEI\n");
			break;
		}
		break;
	default:
		DEBUGP(DMI, "got unexpected 0x%x prim\n", hh->prim);
		break;
	}
	return ret;
}

static int handle_ts1_write(struct bsc_fd *bfd)
{
	struct mi_e1_handle *e1h = bfd->data;
	struct msgb *msg;
	struct mISDNhead *hh;
	int ret, no_oml = 0;

	msg = msgb_dequeue(&e1h->oml_tx_list);
	if (!msg)
		no_oml = 1;
	else {
		u_int8_t *l2_data = msg->data;

		/* prepend the mISDNhead */
		hh = (struct mISDNhead *) msgb_push(msg, sizeof(*hh));
		hh->prim = DL_DATA_REQ;

		if (debug_mask & DMI) {
			fprintf(stdout, "OML TX: ");
			hexdump(l2_data, msg->len - MISDN_HEADER_LEN);
		}

		write_pcap_packet(PCAP_OUTPUT, &e1h->omladdr, msg);
		ret = sendto(bfd->fd, msg->data, msg->len, 0,
			     (struct sockaddr *)&e1h->omladdr,
			     sizeof(e1h->omladdr));
		msgb_free(msg);
		usleep(100000);
		/* we always dequeue all OML messages */
		return ret;
	}

	msg = msgb_dequeue(&e1h->rsl_tx_list);
	if (!msg) {
		if (no_oml)
			bfd->when &= ~BSC_FD_WRITE;
	} else {
		u_int8_t *l2_data = msg->data;

		/* prepend the mISDNhead */
		hh = (struct mISDNhead *) msgb_push(msg, sizeof(*hh));
		hh->prim = DL_DATA_REQ;

		if (debug_mask & DMI) {
			fprintf(stdout, "RSL TX: ");
			hexdump(l2_data, msg->len - MISDN_HEADER_LEN);
		}

		write_pcap_packet(PCAP_OUTPUT, &e1h->l2addr, msg);
		ret = sendto(bfd->fd, msg->data, msg->len, 0,
			     (struct sockaddr *)&e1h->l2addr,
			     sizeof(e1h->l2addr));
		msgb_free(msg);
		usleep(10000);
		//sleep(1);
	}

	return ret;
}

#define TSX_ALLOC_SIZE 4096

/* FIXME: read from a B channel TS */
static int handle_tsX_read(struct bsc_fd *bfd)
{
	struct mi_e1_handle *e1h = bfd->data;
	struct msgb *msg = msgb_alloc(TSX_ALLOC_SIZE);
	struct mISDNhead *hh;
	int ret;

	if (!msg)
		return -ENOMEM;

	hh = (struct mISDNhead *) msg->data;

	/* FIXME: Map TEI/SAPI to TRX */
	msg->trx = e1h->bts->c0;

	ret = recv(bfd->fd, msg->data, TSX_ALLOC_SIZE, 0);
	if (ret < 0) {
		fprintf(stderr, "recvfrom error  %s\n", strerror(errno));
		return ret;
	}

	msgb_put(msg, ret);

	DEBUGP(DMIB, "<= BCHAN len = %d, prim(0x%x) id(0x%x)\n", ret, hh->prim, hh->id);

	switch (hh->prim) {
	case PH_CONTROL_IND:
		DEBUGP(DMIB, "got PH_CONTROL_IND\n");
		break;
	case PH_DATA_IND:
		DEBUGP(DMIB, "got PH_DATA_IND\n");

		msg->l2h = msg->data + MISDN_HEADER_LEN;
		
		if (debug_mask & DMIB) {
			fprintf(stdout, "BCHAN RX: ");
			hexdump(msgb_l2(msg), ret - MISDN_HEADER_LEN);
		}
		if (!e1h->ts2_fd)
			e1h->ts2_fd = open("/tmp/ts2.dump", O_WRONLY|O_APPEND|O_CREAT, 0660);
		
		write(e1h->ts2_fd, msgb_l2(msg), ret - MISDN_HEADER_LEN);

		break;
	default:
		DEBUGP(DMIB, "got unexpected 0x%x prim\n", hh->prim);
		break;
	}
	/* FIXME: don't free it if we still hold reference! */
	msgb_free(msg);

	return ret;
}

static int handle_tsX_write(struct bsc_fd *bfd)
{
	/* FIXME: write to a B channel TS */
	return -1;
}

/* callback from select.c in case one of the fd's can be read/written */
static int misdn_fd_cb(struct bsc_fd *bfd, unsigned int what)
{
	unsigned int e1_ts = bfd->priv_nr;
	int rc = 0;

	switch (e1_ts) {
	case 1:
		if (what & BSC_FD_READ)
			rc = handle_ts1_read(bfd);
		if (what & BSC_FD_WRITE)
			rc = handle_ts1_write(bfd);
		break;
	default:
		if (what & BSC_FD_READ)
			rc = handle_tsX_read(bfd);
		if (what & BSC_FD_WRITE)
			rc = handle_tsX_write(bfd);
		break;
	}

	return rc;
}

int abis_rsl_sendmsg(struct msgb *msg)
{
	struct mi_e1_handle *e1h = global_e1h;

	msg->l2h = msg->data;
	msgb_enqueue(&e1h->rsl_tx_list, msg);
	e1h->fd[0].when |= BSC_FD_WRITE;

	return 0;
}

int _abis_nm_sendmsg(struct msgb *msg)
{
	struct mi_e1_handle *e1h = global_e1h;

	msg->l2h = msg->data;
	msgb_enqueue(&e1h->oml_tx_list, msg);
	e1h->fd[0].when |= BSC_FD_WRITE;

	return 0;
}

static int activate_bchan(struct mi_e1_handle *e1h, int ts)
{
	struct mISDNhead hh;
	int ret;
	struct bsc_fd *bfd = &e1h->fd[ts-1];

	fprintf(stdout, "activate bchan\n");
	hh.prim = PH_ACTIVATE_REQ;
	hh.id = MISDN_ID_ANY;
	ret = sendto(bfd->fd, &hh, sizeof(hh), 0, NULL, 0);
	if (ret < 0) {
		fprintf(stdout, "could not send ACTIVATE_RQ %s\n",
			strerror(errno));
		return 0;
	}

	return ret;
}

static int mi_e1_setup(struct mi_e1_handle *e1h)
{
	int ts, sk, ret, cnt;
	struct mISDN_devinfo devinfo;

	sk = socket(PF_ISDN, SOCK_RAW, ISDN_P_BASE);
	if (sk < 0) {
		fprintf(stderr, "could not open socket %s\n", strerror(errno));
		return sk;
	}

	ret = ioctl(sk, IMGETCOUNT, &cnt);
	if (ret) {
		fprintf(stderr, "error getting interf count: %s\n",
			strerror(errno));
		close(sk);
		return -ENODEV;
	}
	//DEBUGP(DMI,"%d device%s found\n", cnt, (cnt==1)?"":"s");
	printf("%d device%s found\n", cnt, (cnt==1)?"":"s");
#if 1
	devinfo.id = e1h->cardnr;
	ret = ioctl(sk, IMGETDEVINFO, &devinfo);
	if (ret < 0) {
		fprintf(stdout, "error getting info for device %d: %s\n",
			e1h->cardnr, strerror(errno));
		return -ENODEV;
	}
	fprintf(stdout, "        id:             %d\n", devinfo.id);
	fprintf(stdout, "        Dprotocols:     %08x\n", devinfo.Dprotocols);
	fprintf(stdout, "        Bprotocols:     %08x\n", devinfo.Bprotocols);
	fprintf(stdout, "        protocol:       %d\n", devinfo.protocol);
	fprintf(stdout, "        nrbchan:        %d\n", devinfo.nrbchan);
	fprintf(stdout, "        name:           %s\n", devinfo.name);
#endif

	/* TS0 is CRC4, don't need any fd for it */
	for (ts = 1; ts < NUM_E1_TS; ts++) {
		unsigned int idx = ts-1;
		struct bsc_fd *bfd = &e1h->fd[idx];
		struct sockaddr_mISDN addr;

		bfd->data = e1h;
		bfd->priv_nr = ts;
		bfd->cb = misdn_fd_cb;

		if (ts == 1) {
			bfd->fd = socket(PF_ISDN, SOCK_DGRAM, ISDN_P_LAPD_NT);
			bfd->when = BSC_FD_READ;
		} else 
			bfd->fd = socket(PF_ISDN, SOCK_DGRAM, ISDN_P_B_RAW);

		if (bfd->fd < 0) {
			fprintf(stderr, "could not open socket %s\n",
				strerror(errno));
			return bfd->fd;
		}

		memset(&addr, 0, sizeof(addr));
		addr.family = AF_ISDN;
		addr.dev = e1h->cardnr;
		if (ts == 1) {
			addr.channel = 0;
			addr.sapi = 0;/* SAPI not supported yet in kernel */
			addr.tei = TEI_L2ML;
		} else
			addr.channel = ts; 

		ret = bind(bfd->fd, (struct sockaddr *) &addr, sizeof(addr));
		if (ret < 0) {
			fprintf(stderr, "could not bind l2 socket %s\n",
				strerror(errno));
			return -EIO;
		}

		if (ts == 2) {
			bfd->when = BSC_FD_READ;
			activate_bchan(e1h, ts);
		}

		ret = bsc_register_fd(bfd);
		if (ret < 0) {
			fprintf(stderr, "could not register FD: %s\n",
				strerror(ret));
			return ret;
		}
	}

	return 0;
}

int mi_setup(struct gsm_bts *bts, int cardnr, 
	     void (cb)(int event, struct gsm_bts *bts))
{
	struct mi_e1_handle *e1h;

	e1h = malloc(sizeof(*e1h));
	memset(e1h, 0, sizeof(*e1h));

	e1h->cardnr = cardnr;
	e1h->bts = bts;
	e1h->cb = cb;
	INIT_LLIST_HEAD(&e1h->oml_tx_list);
	INIT_LLIST_HEAD(&e1h->rsl_tx_list);

	global_e1h = e1h;

	return mi_e1_setup(e1h);
}
