<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9783">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">remove "channel" layer<br><br>The "channel" layer on top of IPA client + server was introduced in<br>2011 but never used in any osmocom program/project so far.  Contrary<br>to the several other IPA multiplex related implementations in libosmo*,<br>it did not deal properly with segmented IPA messages, i.e. where a<br>single TCP segment (and hence recv/read call) does not contain a full<br>IPA message.<br><br>So rather than fixing it up and having yet another IPA related API in<br>our libraries, let's remove it.<br><br>Change-Id: I97c378750acb1637ee032fa88a968edf68d8979f<br>---<br>M .gitignore<br>M configure.ac<br>M examples/Makefile.am<br>D examples/channel/Makefile.am<br>D examples/channel/abis_ipa_stream_client.c<br>D examples/channel/abis_ipa_stream_server.c<br>M include/osmocom/netif/Makefile.am<br>D include/osmocom/netif/channel.h<br>D include/osmocom/netif/channel/Makefile.am<br>D include/osmocom/netif/channel/abis_ipa_client.h<br>D include/osmocom/netif/channel/abis_ipa_server.h<br>M src/Makefile.am<br>D src/channel.c<br>D src/channel/Makefile.am<br>D src/channel/abis/Makefile.am<br>D src/channel/abis/ipa_stream_client.c<br>D src/channel/abis/ipa_stream_server.c<br>M src/ipa.c<br>18 files changed, 1 insertion(+), 1,141 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/83/9783/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/.gitignore b/.gitignore</span><br><span>index 350e975..31b7a15 100644</span><br><span>--- a/.gitignore</span><br><span>+++ b/.gitignore</span><br><span>@@ -35,8 +35,6 @@</span><br><span> tests/osmux/osmux_test</span><br><span> tests/testsuite.log</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-examples/channel/abis_ipa_stream_client</span><br><span style="color: hsl(0, 100%, 40%);">-examples/channel/abis_ipa_stream_server</span><br><span> examples/ipa-stream-client</span><br><span> examples/ipa-stream-server</span><br><span> examples/lapd-over-datagram-network</span><br><span>diff --git a/configure.ac b/configure.ac</span><br><span>index a04390c..f9346c0 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -118,12 +118,8 @@</span><br><span>   include/Makefile</span><br><span>     include/osmocom/Makefile</span><br><span>     include/osmocom/netif/Makefile</span><br><span style="color: hsl(0, 100%, 40%);">-  include/osmocom/netif/channel/Makefile</span><br><span>       src/Makefile</span><br><span style="color: hsl(0, 100%, 40%);">-    src/channel/Makefile</span><br><span style="color: hsl(0, 100%, 40%);">-    src/channel/abis/Makefile</span><br><span>    examples/Makefile</span><br><span style="color: hsl(0, 100%, 40%);">-       examples/channel/Makefile</span><br><span>    tests/Makefile</span><br><span>       Doxyfile</span><br><span>     Makefile)</span><br><span>diff --git a/examples/Makefile.am b/examples/Makefile.am</span><br><span>index df13808..52f4c83 100644</span><br><span>--- a/examples/Makefile.am</span><br><span>+++ b/examples/Makefile.am</span><br><span>@@ -2,8 +2,6 @@</span><br><span> AM_CFLAGS=-Wall -g $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(COVERAGE_CFLAGS)</span><br><span> AM_LDFLAGS = $(COVERAGE_LDFLAGS)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS = channel</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> noinst_PROGRAMS = ipa-stream-client              \</span><br><span>              ipa-stream-server             \</span><br><span>              lapd-over-datagram-user       \</span><br><span>diff --git a/examples/channel/Makefile.am b/examples/channel/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index c417909..0000000</span><br><span>--- a/examples/channel/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1,14 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CPPFLAGS = -I$(top_srcdir)/include</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CFLAGS=-Wall -g $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(COVERAGE_CFLAGS)</span><br><span style="color: hsl(0, 100%, 40%);">-AM_LDFLAGS = $(COVERAGE_LDFLAGS)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-noinst_PROGRAMS = abis_ipa_stream_server     \</span><br><span style="color: hsl(0, 100%, 40%);">-                 abis_ipa_stream_client</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-abis_ipa_stream_server_SOURCES = abis_ipa_stream_server.c</span><br><span style="color: hsl(0, 100%, 40%);">-abis_ipa_stream_server_LDADD = $(top_builddir)/src/libosmonetif.la     \</span><br><span style="color: hsl(0, 100%, 40%);">-                              $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-abis_ipa_stream_client_SOURCES = abis_ipa_stream_client.c</span><br><span style="color: hsl(0, 100%, 40%);">-abis_ipa_stream_client_LDADD = $(top_builddir)/src/libosmonetif.la        \</span><br><span style="color: hsl(0, 100%, 40%);">-                              $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)</span><br><span>diff --git a/examples/channel/abis_ipa_stream_client.c b/examples/channel/abis_ipa_stream_client.c</span><br><span>deleted file mode 100644</span><br><span>index 8795cc6..0000000</span><br><span>--- a/examples/channel/abis_ipa_stream_client.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,92 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/application.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/channel.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/channel/abis_ipa_client.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/ipa_unit.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void *tall_example;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define DEXAMPLE 0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct log_info_cat example_cat[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      [DEXAMPLE] = {</span><br><span style="color: hsl(0, 100%, 40%);">-          .name = "DEXAMPLE",</span><br><span style="color: hsl(0, 100%, 40%);">-           .description = "example",</span><br><span style="color: hsl(0, 100%, 40%);">-             .color = "\033[1;35m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-const struct log_info example_log_info = {</span><br><span style="color: hsl(0, 100%, 40%);">-  .filter_fn = NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-      .cat = example_cat,</span><br><span style="color: hsl(0, 100%, 40%);">-     .num_cat = ARRAY_SIZE(example_cat),</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void sighandler(int foo)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  LOGP(DEXAMPLE, LOGL_NOTICE, "closing test.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-       exit(EXIT_SUCCESS);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void signal_msg_cb(struct msgb *msg, int type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGP(DEXAMPLE, LOGL_NOTICE, "received signal message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct osmo_chan *chan;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_ipa_unit *unit;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     tall_example = talloc_named_const(NULL, 1, "example");</span><br><span style="color: hsl(0, 100%, 40%);">-        msgb_talloc_ctx_init(tall_example, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_init_logging2(tall_example, &example_log_info);</span><br><span style="color: hsl(0, 100%, 40%);">-        log_set_log_level(osmo_stderr_target, LOGL_DEBUG);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* initialize channel infrastructure. */</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_chan_init(tall_example);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* create channel. */</span><br><span style="color: hsl(0, 100%, 40%);">-   chan = osmo_chan_create(OSMO_CHAN_ABIS_IPA_CLI, OSMO_SUBCHAN_STREAM);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (chan == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DEXAMPLE, LOGL_ERROR, "Cannot create A-bis IPA client\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               exit(EXIT_FAILURE);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* set specific parameters (depends on channel type). */</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_abis_ipa_cli_set_oml_addr(chan, "127.0.0.1");</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_abis_ipa_cli_set_rsl_addr(chan, "127.0.0.1");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    unit = osmo_ipa_unit_alloc(0);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (unit == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DEXAMPLE, LOGL_ERROR, "Cannot create IPA unit\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               exit(EXIT_FAILURE);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_ipa_unit_set_site_id(unit, 1801);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_abis_ipa_cli_set_unit(chan, unit);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_abis_ipa_cli_set_cb_signalmsg(chan, signal_msg_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* open channel. */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (osmo_chan_open(chan) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DEXAMPLE, LOGL_ERROR, "Cannot create A-bis IPA client\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               exit(EXIT_FAILURE);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DEXAMPLE, LOGL_NOTICE, "Entering main loop\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  while(1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_select_main(0);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/examples/channel/abis_ipa_stream_server.c b/examples/channel/abis_ipa_stream_server.c</span><br><span>deleted file mode 100644</span><br><span>index 58a4e15..0000000</span><br><span>--- a/examples/channel/abis_ipa_stream_server.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,79 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/application.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/channel.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/channel/abis_ipa_server.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void *tall_example;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define DEXAMPLE 0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct log_info_cat example_cat[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-  [DEXAMPLE] = {</span><br><span style="color: hsl(0, 100%, 40%);">-          .name = "DEXAMPLE",</span><br><span style="color: hsl(0, 100%, 40%);">-           .description = "example",</span><br><span style="color: hsl(0, 100%, 40%);">-             .color = "\033[1;35m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-const struct log_info example_log_info = {</span><br><span style="color: hsl(0, 100%, 40%);">-  .filter_fn = NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-      .cat = example_cat,</span><br><span style="color: hsl(0, 100%, 40%);">-     .num_cat = ARRAY_SIZE(example_cat),</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void sighandler(int foo)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  LOGP(DEXAMPLE, LOGL_NOTICE, "closing test.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-       exit(EXIT_SUCCESS);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void signal_msg_cb(struct msgb *msg, int type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGP(DEXAMPLE, LOGL_NOTICE, "received signal message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct osmo_chan *chan;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       tall_example = talloc_named_const(NULL, 1, "example");</span><br><span style="color: hsl(0, 100%, 40%);">-        msgb_talloc_ctx_init(tall_example, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_init_logging2(tall_example, &example_log_info);</span><br><span style="color: hsl(0, 100%, 40%);">-        log_set_log_level(osmo_stderr_target, LOGL_DEBUG);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* initialize channel infrastructure. */</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_chan_init(tall_example);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* create channel. */</span><br><span style="color: hsl(0, 100%, 40%);">-   chan = osmo_chan_create(OSMO_CHAN_ABIS_IPA_SRV, OSMO_SUBCHAN_STREAM);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (chan == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DEXAMPLE, LOGL_ERROR, "Cannot create A-bis IPA server\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               exit(EXIT_FAILURE);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* set specific parameters (depends on channel type). */</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_abis_ipa_srv_set_cb_signalmsg(chan, signal_msg_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_abis_ipa_unit_add(chan, 1801, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* open channel. */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (osmo_chan_open(chan) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DEXAMPLE, LOGL_ERROR, "Cannot create A-bis IPA server\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               exit(EXIT_FAILURE);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DEXAMPLE, LOGL_NOTICE, "Entering main loop\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  while(1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_select_main(0);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/include/osmocom/netif/Makefile.am b/include/osmocom/netif/Makefile.am</span><br><span>index 0db78fb..39df08a 100644</span><br><span>--- a/include/osmocom/netif/Makefile.am</span><br><span>+++ b/include/osmocom/netif/Makefile.am</span><br><span>@@ -1,7 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS = channel</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> osmonetif_HEADERS = amr.h             \</span><br><span style="color: hsl(0, 100%, 40%);">-                   channel.h           \</span><br><span>                datagram.h          \</span><br><span>                jibuf.h             \</span><br><span>                osmux.h             \</span><br><span>diff --git a/include/osmocom/netif/channel.h b/include/osmocom/netif/channel.h</span><br><span>deleted file mode 100644</span><br><span>index 1abc828..0000000</span><br><span>--- a/include/osmocom/netif/channel.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,54 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef _CHANNEL_H_</span><br><span style="color: hsl(0, 100%, 40%);">-#define _CHANNEL_H_</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdint.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* channel types */</span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_CHAN_NONE,</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_CHAN_ABIS_IPA_SRV,</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_CHAN_ABIS_IPA_CLI,</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_CHAN_MAX,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* channel subtypes */</span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_SUBCHAN_STREAM,</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_SUBCHAN_MAX,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_chan;</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_chan_type {</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head head;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- char    *name;</span><br><span style="color: hsl(0, 100%, 40%);">-  int     type;</span><br><span style="color: hsl(0, 100%, 40%);">-   int     subtype;</span><br><span style="color: hsl(0, 100%, 40%);">-        int     datasiz;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        int     (*create)(struct osmo_chan *chan);</span><br><span style="color: hsl(0, 100%, 40%);">-      void    (*destroy)(struct osmo_chan *chan);</span><br><span style="color: hsl(0, 100%, 40%);">-     int     (*open)(struct osmo_chan *chan);</span><br><span style="color: hsl(0, 100%, 40%);">-        void    (*close)(struct osmo_chan *chan);</span><br><span style="color: hsl(0, 100%, 40%);">-       int     (*enqueue)(struct osmo_chan *chan, struct msgb *msg);</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_chan {</span><br><span style="color: hsl(0, 100%, 40%);">-       void                    *ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_chan_type   *ops;</span><br><span style="color: hsl(0, 100%, 40%);">-   char                    data[0];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_chan_init(void *ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_chan *osmo_chan_create(int type, int subtype);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_chan_destroy(struct osmo_chan *c);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_chan_open(struct osmo_chan *c);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_chan_close(struct osmo_chan *c);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_chan_enqueue(struct osmo_chan *c, struct msgb *msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif /* _CHANNEL_H_ */</span><br><span>diff --git a/include/osmocom/netif/channel/Makefile.am b/include/osmocom/netif/channel/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index dec19b2..0000000</span><br><span>--- a/include/osmocom/netif/channel/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1,3 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-osmonetif_channel_HEADERS = abis_ipa_server.h abis_ipa_client.h</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-osmonetif_channeldir = $(includedir)/osmocom/netif/channel</span><br><span>diff --git a/include/osmocom/netif/channel/abis_ipa_client.h b/include/osmocom/netif/channel/abis_ipa_client.h</span><br><span>deleted file mode 100644</span><br><span>index cd35852..0000000</span><br><span>--- a/include/osmocom/netif/channel/abis_ipa_client.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,13 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef _OSMO_ABIS_IPA_CLIENT_H_</span><br><span style="color: hsl(0, 100%, 40%);">-#define _OSMO_ABIS_IPA_CLIENT_H_</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_ipa_unit;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_oml_addr(struct osmo_chan *c, const char *addr);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_oml_port(struct osmo_chan *c, uint16_t port);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_rsl_addr(struct osmo_chan *c, const char *addr);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_rsl_port(struct osmo_chan *c, uint16_t port);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_unit(struct osmo_chan *c, struct osmo_ipa_unit *unit);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_cb_signalmsg(struct osmo_chan *c, void (*signal_msg)(struct msgb *msg, int type));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif /* _OSMO_ABIS_IPA_CLIENT_H_ */</span><br><span>diff --git a/include/osmocom/netif/channel/abis_ipa_server.h b/include/osmocom/netif/channel/abis_ipa_server.h</span><br><span>deleted file mode 100644</span><br><span>index 6518f99..0000000</span><br><span>--- a/include/osmocom/netif/channel/abis_ipa_server.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,14 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef _ABIS_IPA_SERVER_H_</span><br><span style="color: hsl(0, 100%, 40%);">-#define _ABIS_IPA_SERVER_H_</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_oml_addr(struct osmo_chan *c, const char *addr);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_oml_port(struct osmo_chan *c, uint16_t port);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_rsl_addr(struct osmo_chan *c, const char *addr);</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_rsl_port(struct osmo_chan *c, uint16_t port);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_cb_signalmsg(struct osmo_chan *c, void (*signal_msg)(struct msgb *msg, int type));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_abis_ipa_unit_add(struct osmo_chan *c, uint16_t site_id, uint16_t bts_id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 9dc5e46..9951ca4 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -6,15 +6,12 @@</span><br><span> AM_CFLAGS= -fPIC -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(COVERAGE_CFLAGS) $(LIBSCTP_CFLAGS)</span><br><span> AM_LDFLAGS = $(COVERAGE_LDFLAGS)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS = channel</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> lib_LTLIBRARIES = libosmonetif.la</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-libosmonetif_la_LIBADD = channel/abis/libosmonetif-abis.la $(LIBOSMOCORE_LIBS) $(LIBSCTP_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+libosmonetif_la_LIBADD = $(LIBOSMOCORE_LIBS) $(LIBSCTP_LIBS)</span><br><span> libosmonetif_la_LDFLAGS = -version-info $(LIBVERSION) -no-undefined</span><br><span> </span><br><span> libosmonetif_la_SOURCES = amr.c                        \</span><br><span style="color: hsl(0, 100%, 40%);">-                         channel.c             \</span><br><span>                      datagram.c            \</span><br><span>                      ipa.c                 \</span><br><span>                      ipa_unit.c            \</span><br><span>diff --git a/src/channel.c b/src/channel.c</span><br><span>deleted file mode 100644</span><br><span>index 2784f22..0000000</span><br><span>--- a/src/channel.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,116 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2011-2012 by Pablo Neira Ayuso <pablo@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * SPDX-License-Identifier: GPL-2.0+</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/channel.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static LLIST_HEAD(channel_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern struct osmo_chan_type chan_abis_ipa_srv;</span><br><span style="color: hsl(0, 100%, 40%);">-extern struct osmo_chan_type chan_abis_ipa_cli;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void *osmo_chan_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_chan_init(void *ctx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_chan_ctx = ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_add(&chan_abis_ipa_srv.head, &channel_list);</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_add(&chan_abis_ipa_cli.head, &channel_list);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* add your new channel type here */</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_chan *osmo_chan_create(int type_id, int subtype_id)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_chan_type *cur = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-      int found = 0, found_partial = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_chan *c;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (type_id > OSMO_CHAN_MAX) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DLINP, LOGL_ERROR, "unsupported channel type "</span><br><span style="color: hsl(0, 100%, 40%);">-                                   "number `%u'\n", type_id);</span><br><span style="color: hsl(0, 100%, 40%);">-                return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (subtype_id > OSMO_SUBCHAN_MAX) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DLINP, LOGL_ERROR, "unsupported subchannel type "</span><br><span style="color: hsl(0, 100%, 40%);">-                                        "number `%u'\n", type_id);</span><br><span style="color: hsl(0, 100%, 40%);">-                return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       llist_for_each_entry(cur, &channel_list, head) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (type_id == cur->type && subtype_id == cur->subtype) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 found = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      break;</span><br><span style="color: hsl(0, 100%, 40%);">-          } else if (type_id == cur->type) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   found_partial = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!found) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DLINP, LOGL_ERROR, "unsupported channel type `%s'\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                        cur->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (found_partial) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DLINP, LOGL_ERROR, "Sorry, channel type `%s' does not "</span><br><span style="color: hsl(0, 100%, 40%);">-                      "support subtype `%u'\n", cur->name, subtype_id);</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       c = talloc_zero_size(osmo_chan_ctx,</span><br><span style="color: hsl(0, 100%, 40%);">-                          sizeof(struct osmo_chan) + cur->datasiz);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (c == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DLINP, LOGL_ERROR, "cannot allocate channel data\n");</span><br><span style="color: hsl(0, 100%, 40%);">-            return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       c->ops = cur;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (c->ops->create(c) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DLINP, LOGL_ERROR, "cannot create channel\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           talloc_free(c);</span><br><span style="color: hsl(0, 100%, 40%);">-         return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       return c;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_chan_destroy(struct osmo_chan *c)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  c->ops->destroy(c);</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(c);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_chan_open(struct osmo_chan *c)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        return c->ops->open(c);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_chan_close(struct osmo_chan *c)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        c->ops->close(c);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_chan_enqueue(struct osmo_chan *c, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   return c->ops->enqueue(c, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/channel/Makefile.am b/src/channel/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index 1c4b7a9..0000000</span><br><span>--- a/src/channel/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS = abis</span><br><span>diff --git a/src/channel/abis/Makefile.am b/src/channel/abis/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index 615abff..0000000</span><br><span>--- a/src/channel/abis/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1,9 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CFLAGS= -fPIC -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)</span><br><span style="color: hsl(0, 100%, 40%);">-AM_LDFLAGS = $(COVERAGE_LDFLAGS)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-noinst_LTLIBRARIES = libosmonetif-abis.la</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-libosmonetif_abis_la_SOURCES = ipa_stream_server.c   \</span><br><span style="color: hsl(0, 100%, 40%);">-                              ipa_stream_client.c</span><br><span style="color: hsl(0, 100%, 40%);">-libosmonetif_abis_la_LIBADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOVTY_LIBS)</span><br><span>diff --git a/src/channel/abis/ipa_stream_client.c b/src/channel/abis/ipa_stream_client.c</span><br><span>deleted file mode 100644</span><br><span>index c610730..0000000</span><br><span>--- a/src/channel/abis/ipa_stream_client.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,309 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2012 by Pablo Neira Ayuso <pablo@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * SPDX-License-Identifier: GPL-2.0+</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/types.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/tcp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/tlv.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/channel.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/stream.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/ipa.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/ipa_unit.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define CHAN_SIGN_OML      0</span><br><span style="color: hsl(0, 100%, 40%);">-#define CHAN_SIGN_RSL  1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* default IPA cli ports. */</span><br><span style="color: hsl(0, 100%, 40%);">-#define IPA_TCP_PORT_OML   3002</span><br><span style="color: hsl(0, 100%, 40%);">-#define IPA_TCP_PORT_RSL    3003</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void *abis_ipa_cli_tall;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct chan_abis_ipa_cli {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_ipa_unit *unit;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_stream_cli *oml;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osmo_stream_cli *rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    void (*signal_msg)(struct msgb *msg, int type);</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int oml_read_cb(struct osmo_stream_cli *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-static int rsl_read_cb(struct osmo_stream_cli *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int chan_abis_ipa_cli_create(struct osmo_chan *chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct chan_abis_ipa_cli *c = (struct chan_abis_ipa_cli *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        c->unit = osmo_ipa_unit_alloc(0);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (c->unit == NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-         goto err;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       c->oml = osmo_stream_cli_create(abis_ipa_cli_tall);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (c->oml == NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-          goto err_oml;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* default address and port for OML. */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_stream_cli_set_addr(c->oml, "0.0.0.0");</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_cli_set_port(c->oml, IPA_TCP_PORT_OML);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_cli_set_read_cb(c->oml, oml_read_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_stream_cli_set_data(c->oml, chan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      c->rsl = osmo_stream_cli_create(abis_ipa_cli_tall);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (c->rsl == NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-          goto err_rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* default address and port for RSL. */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_stream_cli_set_addr(c->rsl, "0.0.0.0");</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_cli_set_port(c->rsl, IPA_TCP_PORT_RSL);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_cli_set_read_cb(c->rsl, rsl_read_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_stream_cli_set_data(c->rsl, chan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-err_rsl:</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_cli_destroy(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-err_oml:</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_ipa_unit_free(c->unit);</span><br><span style="color: hsl(0, 100%, 40%);">-err:</span><br><span style="color: hsl(0, 100%, 40%);">-     return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void chan_abis_ipa_cli_destroy(struct osmo_chan *chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct chan_abis_ipa_cli *c = (struct chan_abis_ipa_cli *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_ipa_unit_free(c->unit);</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(c->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int chan_abis_ipa_cli_open(struct osmo_chan *chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct chan_abis_ipa_cli *c = (struct chan_abis_ipa_cli *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_fd *ofd;</span><br><span style="color: hsl(0, 100%, 40%);">-    int ret, on = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (osmo_stream_cli_open(c->oml) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-             goto err;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ofd = osmo_stream_cli_get_ofd(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-       ret = setsockopt(ofd->fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ret < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         goto err_oml;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (osmo_stream_cli_open(c->rsl) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-             goto err_oml;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   ofd = osmo_stream_cli_get_ofd(c->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-       ret = setsockopt(ofd->fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ret < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         goto err_rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-err_rsl:</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_cli_close(c->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-err_oml:</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_cli_close(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-err:</span><br><span style="color: hsl(0, 100%, 40%);">-   return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void chan_abis_ipa_cli_close(struct osmo_chan *chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct chan_abis_ipa_cli *c = (struct chan_abis_ipa_cli *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_stream_cli_close(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_cli_close(c->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int chan_abis_ipa_cli_enqueue(struct osmo_chan *c, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_cli_send(msg->dst, msg);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_oml_addr(struct osmo_chan *c, const char *addr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct chan_abis_ipa_cli *s = (struct chan_abis_ipa_cli *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_cli_set_addr(s->oml, addr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_oml_port(struct osmo_chan *c, uint16_t port)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct chan_abis_ipa_cli *s = (struct chan_abis_ipa_cli *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_cli_set_port(s->oml, port);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_rsl_addr(struct osmo_chan *c, const char *addr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct chan_abis_ipa_cli *s = (struct chan_abis_ipa_cli *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_cli_set_addr(s->rsl, addr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_rsl_port(struct osmo_chan *c, uint16_t port)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct chan_abis_ipa_cli *s = (struct chan_abis_ipa_cli *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_cli_set_port(s->rsl, port);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_unit(struct osmo_chan *c, struct osmo_ipa_unit *unit)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct chan_abis_ipa_cli *s = (struct chan_abis_ipa_cli *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_ipa_unit_free(s->unit);</span><br><span style="color: hsl(0, 100%, 40%);">- s->unit = unit;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_cli_set_cb_signalmsg(struct osmo_chan *c,</span><br><span style="color: hsl(0, 100%, 40%);">- void (*signal_msg)(struct msgb *msg, int type))</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct chan_abis_ipa_cli *s = (struct chan_abis_ipa_cli *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      s->signal_msg = signal_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int</span><br><span style="color: hsl(0, 100%, 40%);">-abis_ipa_cli_rcvmsg(struct osmo_chan *c, struct osmo_stream_cli *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-             struct msgb *msg, int type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t msg_type = *(msg->l2h);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osmo_fd *ofd = osmo_stream_cli_get_ofd(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-    struct chan_abis_ipa_cli *chan = (struct chan_abis_ipa_cli *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-   int ret;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Handle IPA PING, PONG and ID_ACK messages. */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (osmo_ipa_rcvmsg_base(msg, ofd, 0)) /* XXX: 0 indicates client */</span><br><span style="color: hsl(0, 100%, 40%);">-            return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (msg_type == IPAC_MSGT_ID_GET) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct msgb *rmsg;</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t *data = msgb_l2(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-           int len = msgb_l2len(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DLINP, LOGL_NOTICE, "received ID get\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                rmsg = ipa_cli_id_resp(chan->unit, data + 1, len - 1);</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_stream_cli_send(conn, rmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* send ID_ACK. */</span><br><span style="color: hsl(0, 100%, 40%);">-              rmsg = ipa_cli_id_ack();</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_stream_cli_send(conn, rmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-               ret = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DLINP, LOGL_ERROR, "Unknown IPA message type\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                ret = -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int read_cb(struct osmo_stream_cli *conn, int type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int ret;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_chan *chan = osmo_stream_cli_get_data(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-        struct chan_abis_ipa_cli *s;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct ipa_head *hh;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    LOGP(DLINP, LOGL_DEBUG, "received message from stream\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    msg = osmo_ipa_msg_alloc(0);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (msg == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DLINP, LOGL_ERROR, "cannot allocate message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ret = osmo_stream_cli_recv(conn, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (ret < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DLINP, LOGL_ERROR, "cannot receive message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         /* not the dummy connection, release it. */</span><br><span style="color: hsl(0, 100%, 40%);">-             return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else if (ret == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* link has vanished, dead socket. */</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DLINP, LOGL_ERROR, "closed connection\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (osmo_ipa_process_msg(msg) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DLINP, LOGL_ERROR, "Bad IPA message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       hh = (struct ipa_head *) msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (hh->proto == IPAC_PROTO_IPACCESS) {</span><br><span style="color: hsl(0, 100%, 40%);">-              abis_ipa_cli_rcvmsg(chan, conn, msg, type);</span><br><span style="color: hsl(0, 100%, 40%);">-             msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       chan = osmo_stream_cli_get_data(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (chan == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DLINP, LOGL_ERROR, "no matching signalling link\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (hh->proto != IPAC_PROTO_OML && hh->proto != IPAC_PROTO_RSL) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DLINP, LOGL_ERROR, "wrong protocol\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       msg->dst = chan;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     s = (struct chan_abis_ipa_cli *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-  s->signal_msg(msg, type);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int oml_read_cb(struct osmo_stream_cli *conn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return read_cb(conn, CHAN_SIGN_OML);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int rsl_read_cb(struct osmo_stream_cli *conn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      return read_cb(conn, CHAN_SIGN_RSL);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_chan_type chan_abis_ipa_cli = {</span><br><span style="color: hsl(0, 100%, 40%);">-        .type           = OSMO_CHAN_ABIS_IPA_CLI,</span><br><span style="color: hsl(0, 100%, 40%);">-       .subtype        = OSMO_SUBCHAN_STREAM,</span><br><span style="color: hsl(0, 100%, 40%);">-  .name           = "A-bis IPA client",</span><br><span style="color: hsl(0, 100%, 40%);">- .datasiz        = sizeof(struct chan_abis_ipa_cli),</span><br><span style="color: hsl(0, 100%, 40%);">-     .create         = chan_abis_ipa_cli_create,</span><br><span style="color: hsl(0, 100%, 40%);">-     .destroy        = chan_abis_ipa_cli_destroy,</span><br><span style="color: hsl(0, 100%, 40%);">-    .open           = chan_abis_ipa_cli_open,</span><br><span style="color: hsl(0, 100%, 40%);">-       .close          = chan_abis_ipa_cli_close,</span><br><span style="color: hsl(0, 100%, 40%);">-      .enqueue        = chan_abis_ipa_cli_enqueue,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span>diff --git a/src/channel/abis/ipa_stream_server.c b/src/channel/abis/ipa_stream_server.c</span><br><span>deleted file mode 100644</span><br><span>index 1cd889c..0000000</span><br><span>--- a/src/channel/abis/ipa_stream_server.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,421 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2012 by Pablo Neira Ayuso <pablo@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * SPDX-License-Identifier: GPL-2.0+</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/types.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/tcp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/tlv.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/channel.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/stream.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/ipa.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/ipa_unit.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define CHAN_SIGN_OML      0</span><br><span style="color: hsl(0, 100%, 40%);">-#define CHAN_SIGN_RSL  1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* default IPA srv ports. */</span><br><span style="color: hsl(0, 100%, 40%);">-#define IPA_TCP_PORT_OML   3002</span><br><span style="color: hsl(0, 100%, 40%);">-#define IPA_TCP_PORT_RSL    3003</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void *abis_ipa_srv_tall;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int oml_accept_cb(struct osmo_stream_srv_link *srv, int fd);</span><br><span style="color: hsl(0, 100%, 40%);">-static int rsl_accept_cb(struct osmo_stream_srv_link *srv, int fd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct chan_abis_ipa_srv {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_chan *chan;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_stream_srv_link *oml;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_stream_srv_link *rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       struct llist_head bts_list;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     void (*signal_msg)(struct msgb *msg, int type);</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct chan_abis_ipa_srv_conn {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct chan_abis_ipa_srv *master;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_stream_srv  *oml;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_stream_srv  *rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int chan_abis_ipa_srv_create(struct osmo_chan *chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct chan_abis_ipa_srv *c = (struct chan_abis_ipa_srv *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        c->oml = osmo_stream_srv_link_create(abis_ipa_srv_tall);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (c->oml == NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-          goto err_oml;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* default address and port for OML. */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_stream_srv_link_set_addr(c->oml, "0.0.0.0");</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_srv_link_set_port(c->oml, IPA_TCP_PORT_OML);</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_stream_srv_link_set_accept_cb(c->oml, oml_accept_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_stream_srv_link_set_data(c->oml, c);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    c->rsl = osmo_stream_srv_link_create(abis_ipa_srv_tall);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (c->rsl == NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-          goto err_rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* default address and port for RSL. */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_stream_srv_link_set_addr(c->rsl, "0.0.0.0");</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_srv_link_set_port(c->rsl, IPA_TCP_PORT_RSL);</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_stream_srv_link_set_accept_cb(c->rsl, rsl_accept_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_stream_srv_link_set_data(c->rsl, c);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    INIT_LLIST_HEAD(&c->bts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-err_rsl:</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_srv_link_destroy(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-err_oml:</span><br><span style="color: hsl(0, 100%, 40%);">-        return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void chan_abis_ipa_srv_destroy(struct osmo_chan *chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct chan_abis_ipa_srv *c = (struct chan_abis_ipa_srv *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_stream_srv_link_destroy(c->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_stream_srv_link_destroy(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int chan_abis_ipa_srv_open(struct osmo_chan *chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct chan_abis_ipa_srv *c = (struct chan_abis_ipa_srv *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_fd *ofd;</span><br><span style="color: hsl(0, 100%, 40%);">-    int ret, on = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (osmo_stream_srv_link_open(c->oml) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                goto err;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ofd = osmo_stream_srv_link_get_ofd(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-  ret = setsockopt(ofd->fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ret < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         goto err_oml;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (osmo_stream_srv_link_open(c->rsl) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                goto err_oml;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   ofd = osmo_stream_srv_link_get_ofd(c->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-  ret = setsockopt(ofd->fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ret < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         goto err_rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-err_rsl:</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_srv_link_close(c->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-err_oml:</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_srv_link_close(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-err:</span><br><span style="color: hsl(0, 100%, 40%);">-      return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void chan_abis_ipa_srv_close(struct osmo_chan *chan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct chan_abis_ipa_srv *c = (struct chan_abis_ipa_srv *)chan->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_stream_srv_link_close(c->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_srv_link_close(c->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int chan_abis_ipa_srv_enqueue(struct osmo_chan *c, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_stream_srv_send(msg->dst, msg);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_oml_addr(struct osmo_chan *c, const char *addr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct chan_abis_ipa_srv *s = (struct chan_abis_ipa_srv *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_srv_link_set_addr(s->oml, addr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_oml_port(struct osmo_chan *c, uint16_t port)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct chan_abis_ipa_srv *s = (struct chan_abis_ipa_srv *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_srv_link_set_port(s->oml, port);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_rsl_addr(struct osmo_chan *c, const char *addr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct chan_abis_ipa_srv *s = (struct chan_abis_ipa_srv *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_srv_link_set_addr(s->rsl, addr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_rsl_port(struct osmo_chan *c, uint16_t port)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct chan_abis_ipa_srv *s = (struct chan_abis_ipa_srv *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_srv_link_set_port(s->rsl, port);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_abis_ipa_srv_set_cb_signalmsg(struct osmo_chan *c,</span><br><span style="color: hsl(0, 100%, 40%);">-    void (*signal_msg)(struct msgb *msg, int type))</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct chan_abis_ipa_srv *s = (struct chan_abis_ipa_srv *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      s->signal_msg = signal_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_abis_ipa_unit_add(struct osmo_chan *c, uint16_t site_id, uint16_t bts_id)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_ipa_unit *unit;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct chan_abis_ipa_srv *s = (struct chan_abis_ipa_srv *)&c->data;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct chan_abis_ipa_srv_conn *inst;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    unit = osmo_ipa_unit_alloc(sizeof(struct chan_abis_ipa_srv_conn));</span><br><span style="color: hsl(0, 100%, 40%);">-      if (unit == NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-               return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_ipa_unit_set_site_id(unit, site_id);</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_ipa_unit_set_bts_id(unit, bts_id);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_ipa_unit_add(&s->bts_list, unit);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   inst = osmo_ipa_unit_get_data(unit);</span><br><span style="color: hsl(0, 100%, 40%);">-    inst->master = s;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int oml_read_cb(struct osmo_stream_srv *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int oml_accept_cb(struct osmo_stream_srv_link *srv, int fd)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osmo_stream_srv *conn;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_fd *ofd;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    conn = osmo_stream_srv_create(abis_ipa_srv_tall,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      srv, fd, oml_read_cb, NULL, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (conn == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DLINP, LOGL_ERROR, "error while creating connection\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ofd = osmo_stream_srv_get_ofd(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* XXX: better use chan_abis_ipa_srv_enqueue. */</span><br><span style="color: hsl(0, 100%, 40%);">-        ipaccess_send_id_req(ofd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int rsl_read_cb(struct osmo_stream_srv *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int rsl_accept_cb(struct osmo_stream_srv_link *srv, int fd)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osmo_stream_srv *conn;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_fd *ofd;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    conn = osmo_stream_srv_create(abis_ipa_srv_tall, srv, fd,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     rsl_read_cb, NULL, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- if (conn == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DLINP, LOGL_ERROR, "error while creating connection\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ofd = osmo_stream_srv_get_ofd(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* XXX: better use chan_abis_ipa_srv_enqueue. */</span><br><span style="color: hsl(0, 100%, 40%);">-        ipaccess_send_id_req(ofd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void abis_ipa_put(struct osmo_ipa_unit *unit)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct chan_abis_ipa_srv_conn *inst = osmo_ipa_unit_get_data(unit);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_stream_srv_destroy(inst->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_srv_destroy(inst->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-  inst->oml = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    inst->rsl = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int</span><br><span style="color: hsl(0, 100%, 40%);">-abis_ipa_srv_rcvmsg(struct osmo_stream_srv *conn, struct msgb *msg, int type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t msg_type = *(msg->l2h);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osmo_fd *ofd = osmo_stream_srv_get_ofd(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osmo_stream_srv_link *link = osmo_stream_srv_get_master(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct chan_abis_ipa_srv *s = osmo_stream_srv_link_get_data(link);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct chan_abis_ipa_srv_conn *inst;</span><br><span style="color: hsl(0, 100%, 40%);">-    int ret;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Handle IPA PING, PONG and ID_ACK messages */</span><br><span style="color: hsl(0, 100%, 40%);">- if (osmo_ipa_rcvmsg_base(msg, ofd, 1)) /* XXX: 1 indicates server */</span><br><span style="color: hsl(0, 100%, 40%);">-            return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (msg_type == IPAC_MSGT_ID_RESP) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct osmo_ipa_unit *unit;</span><br><span style="color: hsl(0, 100%, 40%);">-             struct ipaccess_unit unit_data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         if (osmo_ipa_parse_msg_id_resp(msg, &unit_data) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGP(DLINP, LOGL_ERROR, "bad ID RESP message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                     return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               unit = osmo_ipa_unit_find(&s->bts_list, unit_data.site_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         unit_data.bts_id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (unit == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGP(DLINP, LOGL_ERROR, "Unable to find BTS "</span><br><span style="color: hsl(0, 100%, 40%);">-                         "configuration for %u/%u/%u, disconnecting\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                unit_data.site_id, unit_data.bts_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                            unit_data.trx_id);</span><br><span style="color: hsl(0, 100%, 40%);">-                      return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               DEBUGP(DLINP, "Identified BTS %u/%u/%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    unit_data.site_id, unit_data.bts_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                    unit_data.trx_id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              inst = osmo_ipa_unit_get_data(unit);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (type == CHAN_SIGN_OML) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (inst->oml) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             /* link already exists, kill it. */</span><br><span style="color: hsl(0, 100%, 40%);">-                             osmo_stream_srv_destroy(inst->oml);</span><br><span style="color: hsl(0, 100%, 40%);">-                          return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       inst->oml = conn;</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if (type == CHAN_SIGN_RSL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (!inst->oml) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            /* no OML link? Restart from scratch. */</span><br><span style="color: hsl(0, 100%, 40%);">-                                abis_ipa_put(unit);</span><br><span style="color: hsl(0, 100%, 40%);">-                             return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (inst->rsl) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             /* RSL link already exists, kill it. */</span><br><span style="color: hsl(0, 100%, 40%);">-                         osmo_stream_srv_destroy(inst->rsl);</span><br><span style="color: hsl(0, 100%, 40%);">-                          return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       inst->rsl = conn;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_stream_srv_set_data(conn, unit);</span><br><span style="color: hsl(0, 100%, 40%);">-           ret = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DLINP, LOGL_ERROR, "Unknown IPA message type\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                ret = -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int read_cb(struct osmo_stream_srv *conn, int type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int ret;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_ipa_unit *unit = osmo_stream_srv_get_data(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-    struct chan_abis_ipa_srv_conn *inst;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct ipa_head *hh;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    LOGP(DLINP, LOGL_DEBUG, "received message from stream\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    msg = osmo_ipa_msg_alloc(0);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (msg == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DLINP, LOGL_ERROR, "cannot allocate message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ret = osmo_stream_srv_recv(conn, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (ret < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DLINP, LOGL_ERROR, "cannot receive message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (unit != NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-                       abis_ipa_put(unit);</span><br><span style="color: hsl(0, 100%, 40%);">-             else</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmo_stream_srv_destroy(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else if (ret == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* link has vanished, dead socket. */</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DLINP, LOGL_ERROR, "closed connection\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (unit != NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-                       abis_ipa_put(unit);</span><br><span style="color: hsl(0, 100%, 40%);">-             else</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmo_stream_srv_destroy(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ret = osmo_ipa_process_msg(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (ret < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DLINP, LOGL_ERROR, "invalid IPA message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       hh = (struct ipa_head *) msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (hh->proto == IPAC_PROTO_IPACCESS) {</span><br><span style="color: hsl(0, 100%, 40%);">-              abis_ipa_srv_rcvmsg(conn, msg, type);</span><br><span style="color: hsl(0, 100%, 40%);">-           msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (unit == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DLINP, LOGL_ERROR, "no IPA unit associated to this "</span><br><span style="color: hsl(0, 100%, 40%);">-                                     "connection\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       inst = osmo_ipa_unit_get_data(unit);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (hh->proto != IPAC_PROTO_OML && hh->proto != IPAC_PROTO_RSL) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DLINP, LOGL_ERROR, "wrong protocol\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       msg->dst = conn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     inst->master->signal_msg(msg, type);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int oml_read_cb(struct osmo_stream_srv *conn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return read_cb(conn, CHAN_SIGN_OML);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int rsl_read_cb(struct osmo_stream_srv *conn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      return read_cb(conn, CHAN_SIGN_RSL);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_chan_type chan_abis_ipa_srv = {</span><br><span style="color: hsl(0, 100%, 40%);">-        .type           = OSMO_CHAN_ABIS_IPA_SRV,</span><br><span style="color: hsl(0, 100%, 40%);">-       .subtype        = OSMO_SUBCHAN_STREAM,</span><br><span style="color: hsl(0, 100%, 40%);">-  .name           = "A-bis IPA server",</span><br><span style="color: hsl(0, 100%, 40%);">- .datasiz        = sizeof(struct chan_abis_ipa_srv),</span><br><span style="color: hsl(0, 100%, 40%);">-     .create         = chan_abis_ipa_srv_create,</span><br><span style="color: hsl(0, 100%, 40%);">-     .destroy        = chan_abis_ipa_srv_destroy,</span><br><span style="color: hsl(0, 100%, 40%);">-    .open           = chan_abis_ipa_srv_open,</span><br><span style="color: hsl(0, 100%, 40%);">-       .close          = chan_abis_ipa_srv_close,</span><br><span style="color: hsl(0, 100%, 40%);">-      .enqueue        = chan_abis_ipa_srv_enqueue,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span>diff --git a/src/ipa.c b/src/ipa.c</span><br><span>index c924382..3888457 100644</span><br><span>--- a/src/ipa.c</span><br><span>+++ b/src/ipa.c</span><br><span>@@ -31,7 +31,6 @@</span><br><span> </span><br><span> #include <osmocom/gsm/tlv.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/netif/channel.h></span><br><span> #include <osmocom/netif/ipa.h></span><br><span> #include <osmocom/netif/ipa_unit.h></span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9783">change 9783</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9783"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-netif </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I97c378750acb1637ee032fa88a968edf68d8979f </div>
<div style="display:none"> Gerrit-Change-Number: 9783 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>