aboutsummaryrefslogtreecommitdiffstats
path: root/src/channel.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@gnumonks.org>2011-11-06 20:47:08 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2011-11-08 11:17:44 +0100
commit2b5d3ce7c69e1149bb2af815ab8b8534026063ca (patch)
treeadf544975a45d2bbcc7e46f3269aff101f1ed0bb /src/channel.c
parentffe3cb3ef93483c45d23ba7ea7fe156d5bb4dbc6 (diff)
src: add generic channel infrastructure and A-bis IPA server support
This patch adds the generic channel infrastructure that allows to create channel of different types. Each channel has their own configuration functions. struct osmo_chan *chan; chan = osmo_chan_create(tall_example, CHAN_ABIS_IPA_SERVER); ... /* specific configuration functions per supported channel. */ osmo_chan_abis_ipa_server_set_cb_signalmsg(chan, signal_msg_cb); osmo_chan_abis_ipa_unit_add(chan, 1801, 0); /* open channel. */ osmo_chan_open(chan); The input path requires a callback to be registered. The output path is handled through: int osmo_chan_enqueue(struct osmo_chan *c, struct msgb *msg); The msg->dst must be set (it can be taken from the original message to route one reply). This patch also adds A-bis IPA server support. It has been tested with e1inp_ipa_bsc_test available in libosmo-abis.
Diffstat (limited to 'src/channel.c')
-rw-r--r--src/channel.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/channel.c b/src/channel.c
new file mode 100644
index 0000000..5aedd83
--- /dev/null
+++ b/src/channel.c
@@ -0,0 +1,52 @@
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/msgb.h>
+
+#include <osmocom/netif/channel.h>
+
+extern struct osmo_chan_type chan_abis_ipa_server;
+
+static struct osmo_chan_type *chan_type[CHAN_MAX] = {
+ [CHAN_ABIS_IPA_SERVER] = &chan_abis_ipa_server,
+};
+
+struct osmo_chan *osmo_chan_create(void *ctx, int type_id)
+{
+ struct osmo_chan *c;
+
+ if (type_id >= CHAN_MAX)
+ return NULL;
+
+ c = talloc_zero_size(ctx, sizeof(struct osmo_chan) +
+ chan_type[type_id]->datasiz);
+ if (c == NULL)
+ return NULL;
+
+ c->ops = chan_type[type_id];
+
+ if (c->ops->create(c) < 0) {
+ talloc_free(c);
+ return NULL;
+ }
+ return c;
+}
+
+void osmo_chan_destroy(struct osmo_chan *c)
+{
+ c->ops->destroy(c);
+ talloc_free(c);
+}
+
+int osmo_chan_open(struct osmo_chan *c)
+{
+ return c->ops->open(c);
+}
+
+void osmo_chan_close(struct osmo_chan *c)
+{
+ c->ops->close(c);
+}
+
+int osmo_chan_enqueue(struct osmo_chan *c, struct msgb *msg)
+{
+ return c->ops->enqueue(c, msg);
+}