[LAPD] Support multiple instances of LAPD
We cannot afford static/global state, as we may have multiple E1
lines, each having its own LAPD instance. Furthermore, we might
even have multiple LAPD instances on the same E1 line (think of
a multi-drop setup).
This also implements dynamic TEI allocation, i.e. no hardcoded
TEI list anymore.
diff --git a/openbsc/src/input/lapd.h b/openbsc/src/input/lapd.h
index b0e6e6f..f79d84f 100644
--- a/openbsc/src/input/lapd.h
+++ b/openbsc/src/input/lapd.h
@@ -3,6 +3,8 @@
#include <stdint.h>
+#include <osmocore/linuxlist.h>
+
typedef enum {
LAPD_MPH_NONE = 0,
@@ -14,10 +16,22 @@
} lapd_mph_type;
-extern uint8_t *lapd_receive(uint8_t *data, int len, int *ilen, lapd_mph_type *prim, void *cbdata);
+struct lapd_instance {
+ struct llist_head list; /* list of LAPD instances */
+ int network_side;
-extern void (*lapd_transmit_cb)(uint8_t *data, int len, void *cbdata);
+ void (*transmit_cb)(uint8_t *data, int len, void *cbdata);
+ void *cbdata;
-extern void lapd_transmit(int tei, uint8_t *data, int len, void *cbdata);
+ struct llist_head tei_list; /* list of TEI in this LAPD instance */
+};
+
+extern uint8_t *lapd_receive(struct lapd_instance *li, uint8_t *data, unsigned int len,
+ int *ilen, lapd_mph_type *prim);
+
+extern void lapd_transmit(struct lapd_instance *li, uint8_t tei, uint8_t *data, unsigned int len);
+
+struct lapd_instance *lapd_instance_alloc(void (*tx_cb)(uint8_t *data, int len,
+ void *cbdata), void *cbdata);
#endif /* OPENBSC_LAPD_H */