E1 related data model

This data model describes the physical relationship of the individual
parts in the network, it is not the logical/protocol side of the GSM
network.

A BTS is connected to the BSC by some physical link.  It could be an actual
E1 link, but it could also be abis-over-IP with a mixture of TCP and RTP/UDP.

To further complicate the fact, multiple BTS can share one such pysical
link.  On a single E1 line, we can easily accomodate up to three BTS with
two TRX each.

Thus, it is best for OpenBSC to have some kind of abstraction layer.  The BSC's
view of a BTS connected to it.  We call this 'bts_link'.  A bts_link can be
* all the TCP and UDP streams of a Abis-over-IP BTS
* a set of E1 timeslots for OML, RSL and TRAU connections on a E1 link
* a serial line exclusively used for OML messages (T-Link)

A bts_link can be registered with the OpenBSC core at runtime.

struct trx_link {
	struct gsm_bts_trx *trx;
};

struct bts_link {
	struct gsm_bts *bts;
	struct trx_link trx_links[NUM_TRX];
};

Interface from stack to input core:
======================================================================
int abis_rsl_sendmsg(struct msgb *msg);
	send a message through a RSL link to the TRX specified by the caller in
	msg->trx.

int abis_rsl_rcvmsg(struct msgb *msg);
	receive a message from a RSL link from the TRX specified by the
	caller in msg->trx.

int abis_nm_sendmsg(struct msgb *msg);
	send a message through a OML link to the BTS specified by the caller in
	msg->trx->bts.  The caller can just use bts->c0 to get the first TRX
	in a BTS. (OML messages are not really sent to a TRX but to the BTS)

int abis_nm_rcvmsg(struct msgb *msg);
	receive a message from a OML link from the BTS specified by the caller
	in msg->trx->bts.  The caller can just use bts->c0 to get the first
	TRX in a BTS.

int abis_link_event(int event, void *data);
	signal some event (such as layer 1 connect/disconnect) from the
	input core to the stack.

int subch_demux_in(mx, const uint8_t *data, int len);
	receive 'len' bytes from a given E1 timeslot (TRAU frames)

int subchan_mux_out(mx, uint8_t *data, int len);
	obtain 'len' bytes of output data to be sent on E1 timeslot

Intrface by Input Core for Input Plugins
======================================================================

int btslink_register_plugin();


Configuration for the E1 input module
======================================================================

BTS
	BTS number
	number of TRX
	OML link
		E1 line number
		timeslot number
		[subslot number]
		SAPI
		TEI
	for each TRX
		RSL link
			E1 line number
			timeslot number
			[subslot number]
			SAPI
			TEI
		for each TS
			E1 line number
			timeslot number
			subslot number


E1 input module data model
======================================================================


enum e1inp_sign_type {
	E1INP_SIGN_NONE,
	E1INP_SIGN_OML,
	E1INP_SIGN_RSL,
};

struct e1inp_sign_link {
	/* list of signalling links */
	struct llist_head list;

	enum e1inp_sign_type type;

	/* trx for msg->trx of received msgs */	
	struct gsm_bts_trx *trx;

	/* msgb queue of to-be-transmitted msgs */
	struct llist_head tx_list;

	/* SAPI and TEI on the E1 TS */
	uint8_t sapi;
	uint8_t tei;
}

enum e1inp_ts_type {
	E1INP_TS_TYPE_NONE,
	E1INP_TS_TYPE_SIGN,
	E1INP_TS_TYPE_TRAU,
};

/* A timeslot in the E1 interface */
struct e1inp_ts {
	enum e1inp_ts_type type;
	struct e1inp_line *line;
	union {
		struct {
			struct llist_head sign_links;
		} sign;
		struct {
			/* subchannel demuxer for frames from E1 */
			struct subch_demux demux;
			/* subchannel muxer for frames to E1 */
			struct subch_mux mux;
		} trau;
	};
	union {
		struct {
			/* mISDN driver has one fd for each ts */
			struct osmo_fd;
		} misdn;
	} driver;
};

struct e1inp_line {
	unsigned int num;
	char *name;

	struct e1inp_ts ts[NR_E1_TS];

	char *e1inp_driver;
	void *driver_data;
};

/* Call from the Stack: configuration of this TS has changed */
int e1inp_update_ts(struct e1inp_ts *ts);

/* Receive a packet from the E1 driver */
int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg,
		uint8_t tei, uint8_t sapi);

/* Send a packet, callback function in the driver */
int e1driver_tx_ts(struct e1inp_ts *ts, struct msgb *msg)


struct e1inp_driver {
	const char *name;
	int (*want_write)(struct e1inp_ts *ts);
};
