initial commit of libosmo-abis

still many things to get fixed
diff --git a/tests/e1inp_ipa_bsc_test.c b/tests/e1inp_ipa_bsc_test.c
new file mode 100644
index 0000000..8985e98
--- /dev/null
+++ b/tests/e1inp_ipa_bsc_test.c
@@ -0,0 +1,69 @@
+#include <stdio.h>
+#include <osmocom/gsm/abis/e1_input.h>
+
+static int rx_cb(struct msgb *msg, struct e1inp_ts *ts)
+{
+	printf("received data\n");
+
+	/* For ISDN: from the timeslot type, we can get if it's:
+	 * - E1INP_TS_TYPE_SIGN: in this case, check if we have a signal
+	 *   link in this timeslot, then, check if it's OML or RSL and pass
+	 *   it to the upper layer.
+	 * - E1INP_TS_TYPE_TRAU.
+	 *
+	 * For INET: we have to check if this is a control message, if it's
+	 * a response to previous request id, we enable the signal links for
+	 * OML and RSL. Otherwise, look up for the existing signal link and
+	 * pass it to the upper layer. We don't receive TRAU frames, we use
+	 * RTP.
+	 */
+	return 0;
+}
+
+static int rx_err_cb(int error)
+{
+	printf("error, malformed message\n");
+	return 0;
+}
+
+int main(void)
+{
+	struct e1inp_line *line;
+	struct e1inp_ts *sign_ts;
+
+	e1inp_init();
+
+#define LINENR 0
+
+	line = e1inp_line_create(LINENR, "ipa", rx_cb, rx_err_cb);
+	if (line == NULL) {
+		fprintf(stderr, "problem creating E1 line\n");
+		exit(EXIT_FAILURE);
+	}
+	sign_ts = &line->ts[0];
+	if (e1inp_ts_config_sign(sign_ts, line) < 0) {
+		fprintf(stderr, "problem setting timeslot in E1 line\n");
+		exit(EXIT_FAILURE);
+	}
+
+	/*
+	 * Depending if this is a real or virtual E1 lines:
+	 * - real (ISDN): create signal link for OML and RSL before line up.
+	 * - vitual (INET): we create it once we have seen response to REQ_ID.
+	 *
+	 * The signal link is created via e1inp_sign_link_create(...)
+	 *
+	 * See e1_reconfig_trx and e1_reconfig_bts in libbsc/e1_config.c,
+	 * it explains how this is done with ISDN.
+	 */
+
+	if (e1inp_line_update(line, E1INP_LINE_R_BSC) < 0) {
+		fprintf(stderr, "problem enabling E1 line\n");
+		exit(EXIT_FAILURE);
+	}
+
+	while (1) {
+		osmo_select_main(0);
+	}
+	return 0;
+}