create libosmoisdn sub-library

There are some parts of libosmogsm which are not really GSM specific,
but rather ISDN bits that were inherited by GSM.  This includes the
I.460 multiplex as well as the core LAPD protocol.

Let's move those bits to its own libosmoisdn library, before we add
more ISDN specific bits to the wrong place.

Backwards-compatibility is created by making libosmogsm depend on
libosmoisdn, and by providing wrapper include files for source
compatibility.

Change-Id: Ib1a6c762322fd5047be3188b1df22408ef06aa50
diff --git a/include/osmocom/gsm/i460_mux.h b/include/osmocom/gsm/i460_mux.h
index 770b1e1..7c2f4af 100644
--- a/include/osmocom/gsm/i460_mux.h
+++ b/include/osmocom/gsm/i460_mux.h
@@ -1,116 +1,2 @@
-/*! \file i460_mux.h
- * ITU-T I.460 sub-channel multiplexer + demultiplexer */
-/*
- * (C) 2020 by Harald Welte <laforge@gnumonks.org>
- *
- * SPDX-License-Identifier: GPL-2.0+
- *
- *  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.
- */
-
 #pragma once
-#include <stdint.h>
-#include <osmocom/core/bits.h>
-#include <osmocom/core/linuxlist.h>
-#include <osmocom/core/msgb.h>
-
-/* I.460 sub-slot rate */
-enum osmo_i460_rate {
-	OSMO_I460_RATE_NONE,		/* disabled */
-	OSMO_I460_RATE_64k,
-	OSMO_I460_RATE_32k,
-	OSMO_I460_RATE_16k,
-	OSMO_I460_RATE_8k,
-};
-
-struct osmo_i460_subchan;
-
-typedef void (*out_cb_bits_t)(struct osmo_i460_subchan *schan, void *user_data,
-			      const ubit_t *bits, unsigned int num_bits);
-typedef void (*out_cb_bytes_t)(struct osmo_i460_subchan *schan, void *user_data,
-			       const uint8_t *bytes, unsigned int num_bytes);
-
-struct osmo_i460_subchan_demux {
-	/*! bit-buffer for output bits */
-	uint8_t *out_bitbuf;
-	/*! size of out_bitbuf in bytes */
-	unsigned int out_bitbuf_size;
-	/*! offset of next bit to be written in out_bitbuf */
-	unsigned int out_idx;
-	/*! callback to be called once we have received out_bitbuf_size bits */
-	out_cb_bits_t out_cb_bits;
-	out_cb_bytes_t out_cb_bytes;
-	void *user_data;
-};
-
-typedef void (*in_cb_queue_empty_t)(struct osmo_i460_subchan *schan, void *user_data);
-
-struct osmo_i460_subchan_mux {
-	/*! list of to-be-transmitted message buffers */
-	struct llist_head tx_queue;
-	in_cb_queue_empty_t in_cb_queue_empty;
-	void *user_data;
-};
-
-struct osmo_i460_subchan {
-	struct osmo_i460_timeslot *ts;	/* back-pointer */
-	enum osmo_i460_rate rate;		/* 8/16/32/64k */
-	uint8_t bit_offset;		/* bit offset inside each byte of the B-channel */
-	struct osmo_i460_subchan_demux demux;
-	struct osmo_i460_subchan_mux mux;
-};
-
-struct osmo_i460_timeslot {
-	struct osmo_i460_subchan schan[8];
-};
-
-/*! description of a sub-channel; passed by caller */
-struct osmo_i460_schan_desc {
-	enum osmo_i460_rate rate;
-	uint8_t bit_offset;
-	struct {
-		/* size (in bits) of the internal buffer; determines granularity */
-		size_t num_bits;
-		/*! call-back function called whenever we received num_bits */
-		out_cb_bits_t out_cb_bits;
-		/*! out_cb_bytes call-back function called whenever we received num_bits.
-		 * The user is usually expected to provide either out_cb_bits or out_cb_bytes.  If only
-		 * out_cb_bits is provided, output data will always be provided as unpacked bits;  if only
-		 * out_cb_bytes is provided, output data will always be provided as packet bits (bytes).  If
-		 * both are provided, it is up to the I.460 multiplex to decide if it calls either of the two,
-		 * depending on what can be provided without extra conversion. */
-		out_cb_bytes_t out_cb_bytes;
-		/* opaque user data pointer to pass to out_cb */
-		void *user_data;
-	} demux;
-
-	struct {
-		/* call-back function whenever the muxer requires more input data from the sub-channels,
-		 * but has nothing enqueued yet. A typical function would then call osmo_i460_mux_enqueue() */
-		in_cb_queue_empty_t in_cb_queue_empty;
-		/* opaque user data pointer to pass to in_cb */
-		void *user_data;
-	} mux;
-};
-
-void osmo_i460_demux_in(struct osmo_i460_timeslot *ts, const uint8_t *data, size_t data_len);
-
-void osmo_i460_mux_enqueue(struct osmo_i460_subchan *schan, struct msgb *msg);
-int osmo_i460_mux_out(struct osmo_i460_timeslot *ts, uint8_t *out, size_t out_len);
-
-void osmo_i460_ts_init(struct osmo_i460_timeslot *ts);
-
-struct osmo_i460_subchan *
-osmo_i460_subchan_add(void *ctx, struct osmo_i460_timeslot *ts, const struct osmo_i460_schan_desc *chd);
-
-void osmo_i460_subchan_del(struct osmo_i460_subchan *schan);
-
-/*! @} */
+#include <osmocom/isdn/i460_mux.h>