<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26341">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move Iuh code to its own module<br><br>The Iuh code will be further extended next to properly support<br>reconnect, and hnb will also gain proper shutdown support soon.<br><br>Change-Id: I6e94210ab06a34b70c61bb074c58d7b0f4ee75de<br>---<br>M include/osmocom/hnodeb/Makefile.am<br>M include/osmocom/hnodeb/hnodeb.h<br>A include/osmocom/hnodeb/iuh.h<br>M src/osmo-hnodeb/Makefile.am<br>M src/osmo-hnodeb/hnb.c<br>M src/osmo-hnodeb/hnbap.c<br>A src/osmo-hnodeb/iuh.c<br>M src/osmo-hnodeb/main.c<br>M src/osmo-hnodeb/rua.c<br>M src/osmo-hnodeb/vty.c<br>10 files changed, 219 insertions(+), 146 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-hnodeb refs/changes/41/26341/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/hnodeb/Makefile.am b/include/osmocom/hnodeb/Makefile.am</span><br><span>index 197568c..23adb2a 100644</span><br><span>--- a/include/osmocom/hnodeb/Makefile.am</span><br><span>+++ b/include/osmocom/hnodeb/Makefile.am</span><br><span>@@ -1,6 +1,7 @@</span><br><span> noinst_HEADERS = \</span><br><span>         hnbap.h \</span><br><span>    hnodeb.h \</span><br><span style="color: hsl(120, 100%, 40%);">+    iuh.h \</span><br><span>      nas.h \</span><br><span>      ranap.h \</span><br><span>    rua.h \</span><br><span>diff --git a/include/osmocom/hnodeb/hnodeb.h b/include/osmocom/hnodeb/hnodeb.h</span><br><span>index 5d6d088..4cc0831 100644</span><br><span>--- a/include/osmocom/hnodeb/hnodeb.h</span><br><span>+++ b/include/osmocom/hnodeb/hnodeb.h</span><br><span>@@ -36,18 +36,6 @@</span><br><span> };</span><br><span> extern const struct log_info hnb_log_info;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* 25.467 Section 7.1 */</span><br><span style="color: hsl(0, 100%, 40%);">-#define IUH_DEFAULT_SCTP_PORT      29169</span><br><span style="color: hsl(0, 100%, 40%);">-#define RNA_DEFAULT_SCTP_PORT      25471</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define IUH_PPI_RUA                19</span><br><span style="color: hsl(0, 100%, 40%);">-#define IUH_PPI_HNBAP         20</span><br><span style="color: hsl(0, 100%, 40%);">-#define IUH_PPI_SABP          31</span><br><span style="color: hsl(0, 100%, 40%);">-#define IUH_PPI_RNA           42</span><br><span style="color: hsl(0, 100%, 40%);">-#define IUH_PPI_PUA           55</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define IUH_MSGB_SIZE 2048</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct hnb_chan {</span><br><span>    int is_ps;</span><br><span>   uint32_t conn_id;</span><br><span>@@ -77,11 +65,9 @@</span><br><span>               struct hnb_chan *chan;</span><br><span>       } cs;</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct hnb *hnb_alloc(void *tall_ctx);</span><br><span> void hnb_free(struct hnb *hnb);</span><br><span style="color: hsl(0, 100%, 40%);">-int hnb_connect(struct hnb *hnb);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int hnb_iuh_send(struct hnb *hnb, struct msgb *msg);</span><br><span> </span><br><span> extern void *tall_hnb_ctx;</span><br><span> extern struct hnb *g_hnb;</span><br><span>diff --git a/include/osmocom/hnodeb/iuh.h b/include/osmocom/hnodeb/iuh.h</span><br><span>new file mode 100644</span><br><span>index 0000000..81ce1de</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/hnodeb/iuh.h</span><br><span>@@ -0,0 +1,41 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2015 by Daniel Willmann <dwillmann@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* 25.467 Section 7.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define IUH_DEFAULT_SCTP_PORT     29169</span><br><span style="color: hsl(120, 100%, 40%);">+#define RNA_DEFAULT_SCTP_PORT    25471</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define IUH_PPI_RUA            19</span><br><span style="color: hsl(120, 100%, 40%);">+#define IUH_PPI_HNBAP               20</span><br><span style="color: hsl(120, 100%, 40%);">+#define IUH_PPI_SABP                31</span><br><span style="color: hsl(120, 100%, 40%);">+#define IUH_PPI_RNA         42</span><br><span style="color: hsl(120, 100%, 40%);">+#define IUH_PPI_PUA         55</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define IUH_MSGB_SIZE     2048</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct hnb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_iuh_alloc(struct hnb *hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_iuh_free(struct hnb *hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+int hnb_iuh_connect(struct hnb *hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+int hnb_iuh_send(struct hnb *hnb, struct msgb *msg);</span><br><span>diff --git a/src/osmo-hnodeb/Makefile.am b/src/osmo-hnodeb/Makefile.am</span><br><span>index 139b6b0..88f2571 100644</span><br><span>--- a/src/osmo-hnodeb/Makefile.am</span><br><span>+++ b/src/osmo-hnodeb/Makefile.am</span><br><span>@@ -33,6 +33,7 @@</span><br><span>   debug.c \</span><br><span>    hnbap.c \</span><br><span>    hnb.c \</span><br><span style="color: hsl(120, 100%, 40%);">+       iuh.c \</span><br><span>      nas.c \</span><br><span>      ranap.c \</span><br><span>    rua.c \</span><br><span>diff --git a/src/osmo-hnodeb/hnb.c b/src/osmo-hnodeb/hnb.c</span><br><span>index 420095d..3344cfb 100644</span><br><span>--- a/src/osmo-hnodeb/hnb.c</span><br><span>+++ b/src/osmo-hnodeb/hnb.c</span><br><span>@@ -20,99 +20,17 @@</span><br><span> </span><br><span> #include "config.h"</span><br><span> </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 <sys/types.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/socket.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/sctp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <arpa/inet.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #include <osmocom/core/socket.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/netif/stream.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/hnodeb/hnbap.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/hnodeb/rua.h></span><br><span> #include <osmocom/hnodeb/hnodeb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/iuh.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int hnb_iuh_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%);">- struct osmo_fd *fd = osmo_stream_cli_get_ofd(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-     struct hnb *hnb = osmo_stream_cli_get_data(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sctp_sndrcvinfo sinfo;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb *msg = msgb_alloc(IUH_MSGB_SIZE, "Iuh rx");</span><br><span style="color: hsl(0, 100%, 40%);">-       int flags = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!msg)</span><br><span style="color: hsl(0, 100%, 40%);">-               return -ENOMEM;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = sctp_recvmsg(fd->fd, msgb_data(msg), msgb_tailroom(msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                          NULL, NULL, &sinfo, &flags);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMAIN, LOGL_ERROR, "Error during sctp_recvmsg()\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             /* FIXME: clean up after disappeared HNB */</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_stream_cli_close(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-            goto free_ret;</span><br><span style="color: hsl(0, 100%, 40%);">-  } else if (rc == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMAIN, LOGL_INFO, "Connection to HNB closed\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_stream_cli_close(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                goto free_ret;</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                msgb_put(msg, rc);</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 (flags & MSG_NOTIFICATION) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DMAIN, LOGL_DEBUG, "Ignoring SCTP notification\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-         goto free_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%);">-       sinfo.sinfo_ppid = ntohl(sinfo.sinfo_ppid);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     switch (sinfo.sinfo_ppid) {</span><br><span style="color: hsl(0, 100%, 40%);">-     case IUH_PPI_HNBAP:</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DHNBAP, LOGL_INFO, "HNBAP message received\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = hnb_hnbap_rx(hnb, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case IUH_PPI_RUA:</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DRUA, LOGL_INFO, "RUA message received\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              rc = hnb_rua_rx(hnb, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case IUH_PPI_SABP:</span><br><span style="color: hsl(0, 100%, 40%);">-      case IUH_PPI_RNA:</span><br><span style="color: hsl(0, 100%, 40%);">-       case IUH_PPI_PUA:</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DMAIN, LOGL_ERROR, "Unimplemented SCTP PPID=%u received\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   sinfo.sinfo_ppid);</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMAIN, LOGL_ERROR, "Unknown SCTP PPID=%u received\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 sinfo.sinfo_ppid);</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = 0;</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%);">-free_ret:</span><br><span style="color: hsl(0, 100%, 40%);">-      msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</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 hnb_iuh_connect_cb(struct osmo_stream_cli *conn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DMAIN, LOGL_NOTICE, "Iuh connected to HNBGW\n");</span><br><span style="color: hsl(0, 100%, 40%);">- struct hnb *hnb = osmo_stream_cli_get_data(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       hnb_send_register_req(hnb);</span><br><span style="color: hsl(0, 100%, 40%);">-     return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span> </span><br><span> struct hnb *hnb_alloc(void *tall_ctx)</span><br><span> {</span><br><span>         struct hnb *hnb;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_stream_cli *cli;</span><br><span> </span><br><span>     hnb = talloc_zero(tall_ctx, struct hnb);</span><br><span>     if (!hnb)</span><br><span>@@ -123,58 +41,13 @@</span><br><span>             .mcc = 1,</span><br><span>            .mnc = 1,</span><br><span>    };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      hnb->iuh.local_addr = talloc_strdup(hnb, "0.0.0.0");</span><br><span style="color: hsl(0, 100%, 40%);">-       hnb->iuh.local_port = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     hnb->iuh.remote_addr = talloc_strdup(hnb, "127.0.0.1");</span><br><span style="color: hsl(0, 100%, 40%);">-    hnb->iuh.remote_port = IUH_DEFAULT_SCTP_PORT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        cli = osmo_stream_cli_create(hnb);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(cli);</span><br><span style="color: hsl(0, 100%, 40%);">-       hnb->iuh.client = cli;</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stream_cli_set_nodelay(cli, true);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_stream_cli_set_proto(cli, IPPROTO_SCTP);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_stream_cli_set_reconnect_timeout(cli, 5);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_cli_set_connect_cb(cli, hnb_iuh_connect_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_stream_cli_set_read_cb(cli, hnb_iuh_read_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_cli_set_data(cli, hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+   hnb_iuh_alloc(hnb);</span><br><span> </span><br><span>      return hnb;</span><br><span> }</span><br><span> </span><br><span> void hnb_free(struct hnb *hnb)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     if (hnb->iuh.client) {</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_stream_cli_destroy(hnb->iuh.client);</span><br><span style="color: hsl(0, 100%, 40%);">-            hnb->iuh.client = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(120, 100%, 40%);">+     hnb_iuh_free(hnb);</span><br><span>   talloc_free(hnb);</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int hnb_connect(struct hnb *hnb)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DMAIN, LOGL_INFO, "Iuh Connect: %s[:%u] => %s[:%u]\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             hnb->iuh.local_addr, hnb->iuh.local_port, hnb->iuh.remote_addr, hnb->iuh.remote_port);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_stream_cli_set_addrs(hnb->iuh.client, (const char**)&hnb->iuh.remote_addr, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_stream_cli_set_port(hnb->iuh.client, hnb->iuh.remote_port);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stream_cli_set_local_addrs(hnb->iuh.client, (const char**)&hnb->iuh.local_addr, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stream_cli_set_local_port(hnb->iuh.client, hnb->iuh.local_port);</span><br><span style="color: hsl(0, 100%, 40%);">-     rc = osmo_stream_cli_open(hnb->iuh.client);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMAIN, LOGL_ERROR, "Unable to open stream client for Iuh %s[:%u] => %s[:%u]\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    hnb->iuh.local_addr, hnb->iuh.local_port, hnb->iuh.remote_addr, hnb->iuh.remote_port);</span><br><span style="color: hsl(0, 100%, 40%);">-         /* we don't return error in here because osmo_stream_cli_open()</span><br><span style="color: hsl(0, 100%, 40%);">-                will continue to retry (due to timeout being explicitly set with</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_stream_cli_set_reconnect_timeout() above) to connect so the error is transient */</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%);">-int hnb_iuh_send(struct hnb *hnb, 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(hnb->iuh.client, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/osmo-hnodeb/hnbap.c b/src/osmo-hnodeb/hnbap.c</span><br><span>index bcddfb3..585354b 100644</span><br><span>--- a/src/osmo-hnodeb/hnbap.c</span><br><span>+++ b/src/osmo-hnodeb/hnbap.c</span><br><span>@@ -32,6 +32,7 @@</span><br><span> </span><br><span> #include <osmocom/hnodeb/hnbap.h></span><br><span> #include <osmocom/hnodeb/hnodeb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/iuh.h></span><br><span> </span><br><span> static int hnb_rx_hnb_register_acc(struct hnb *hnb, ANY_t *in)</span><br><span> {</span><br><span>diff --git a/src/osmo-hnodeb/iuh.c b/src/osmo-hnodeb/iuh.c</span><br><span>new file mode 100644</span><br><span>index 0000000..481c841</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-hnodeb/iuh.c</span><br><span>@@ -0,0 +1,167 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2015 by Daniel Willmann <dwillmann@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/types.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/sctp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arpa/inet.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/netif/stream.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/iuh.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/hnbap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/rua.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/hnodeb.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int hnb_iuh_read_cb(struct osmo_stream_cli *conn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_fd *fd = osmo_stream_cli_get_ofd(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct hnb *hnb = osmo_stream_cli_get_data(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct sctp_sndrcvinfo sinfo;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg = msgb_alloc(IUH_MSGB_SIZE, "Iuh rx");</span><br><span style="color: hsl(120, 100%, 40%);">+     int flags = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = sctp_recvmsg(fd->fd, msgb_data(msg), msgb_tailroom(msg),</span><br><span style="color: hsl(120, 100%, 40%);">+                        NULL, NULL, &sinfo, &flags);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMAIN, LOGL_ERROR, "Error during sctp_recvmsg()\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           /* FIXME: clean up after disappeared HNB */</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_stream_cli_close(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+          goto free_ret;</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (rc == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DMAIN, LOGL_INFO, "Connection to HNBGW closed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_stream_cli_close(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+              goto free_ret;</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              msgb_put(msg, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (flags & MSG_NOTIFICATION) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DMAIN, LOGL_DEBUG, "Ignoring SCTP notification\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+               goto free_ret;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   sinfo.sinfo_ppid = ntohl(sinfo.sinfo_ppid);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (sinfo.sinfo_ppid) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case IUH_PPI_HNBAP:</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DHNBAP, LOGL_INFO, "HNBAP message received\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = hnb_hnbap_rx(hnb, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case IUH_PPI_RUA:</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DRUA, LOGL_INFO, "RUA message received\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = hnb_rua_rx(hnb, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case IUH_PPI_SABP:</span><br><span style="color: hsl(120, 100%, 40%);">+    case IUH_PPI_RNA:</span><br><span style="color: hsl(120, 100%, 40%);">+     case IUH_PPI_PUA:</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMAIN, LOGL_ERROR, "Unimplemented SCTP PPID=%u received\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 sinfo.sinfo_ppid);</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMAIN, LOGL_ERROR, "Unknown SCTP PPID=%u received\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               sinfo.sinfo_ppid);</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+free_ret:</span><br><span style="color: hsl(120, 100%, 40%);">+        msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int hnb_iuh_connect_cb(struct osmo_stream_cli *conn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGP(DMAIN, LOGL_NOTICE, "Iuh connected to HNBGW\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       struct hnb *hnb = osmo_stream_cli_get_data(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   hnb_send_register_req(hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_iuh_alloc(struct hnb *hnb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_stream_cli *cli;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        hnb->iuh.local_addr = talloc_strdup(hnb, "0.0.0.0");</span><br><span style="color: hsl(120, 100%, 40%);">+     hnb->iuh.local_port = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   hnb->iuh.remote_addr = talloc_strdup(hnb, "127.0.0.1");</span><br><span style="color: hsl(120, 100%, 40%);">+  hnb->iuh.remote_port = IUH_DEFAULT_SCTP_PORT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    cli = osmo_stream_cli_create(hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(cli);</span><br><span style="color: hsl(120, 100%, 40%);">+     hnb->iuh.client = cli;</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_stream_cli_set_nodelay(cli, true);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_stream_cli_set_proto(cli, IPPROTO_SCTP);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stream_cli_set_reconnect_timeout(cli, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stream_cli_set_connect_cb(cli, hnb_iuh_connect_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_stream_cli_set_read_cb(cli, hnb_iuh_read_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_stream_cli_set_data(cli, hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_iuh_free(struct hnb *hnb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!hnb->iuh.client)</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_stream_cli_destroy(hnb->iuh.client);</span><br><span style="color: hsl(120, 100%, 40%);">+  hnb->iuh.client = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int hnb_iuh_connect(struct hnb *hnb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DMAIN, LOGL_INFO, "Iuh Connect: %s[:%u] => %s[:%u]\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           hnb->iuh.local_addr, hnb->iuh.local_port, hnb->iuh.remote_addr, hnb->iuh.remote_port);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_stream_cli_set_addrs(hnb->iuh.client, (const char**)&hnb->iuh.remote_addr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stream_cli_set_port(hnb->iuh.client, hnb->iuh.remote_port);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stream_cli_set_local_addrs(hnb->iuh.client, (const char**)&hnb->iuh.local_addr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_stream_cli_set_local_port(hnb->iuh.client, hnb->iuh.local_port);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = osmo_stream_cli_open(hnb->iuh.client);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMAIN, LOGL_ERROR, "Unable to open stream client for Iuh %s[:%u] => %s[:%u]\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  hnb->iuh.local_addr, hnb->iuh.local_port, hnb->iuh.remote_addr, hnb->iuh.remote_port);</span><br><span style="color: hsl(120, 100%, 40%);">+               /* we don't return error in here because osmo_stream_cli_open()</span><br><span style="color: hsl(120, 100%, 40%);">+              will continue to retry (due to timeout being explicitly set with</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_stream_cli_set_reconnect_timeout() above) to connect so the error is transient */</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int hnb_iuh_send(struct hnb *hnb, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stream_cli_send(hnb->iuh.client, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-hnodeb/main.c b/src/osmo-hnodeb/main.c</span><br><span>index 3376d8e..12d98ff 100644</span><br><span>--- a/src/osmo-hnodeb/main.c</span><br><span>+++ b/src/osmo-hnodeb/main.c</span><br><span>@@ -48,6 +48,7 @@</span><br><span> #include <osmocom/hnodeb/ranap.h></span><br><span> #include <osmocom/hnodeb/vty.h></span><br><span> #include <osmocom/hnodeb/hnodeb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/iuh.h></span><br><span> </span><br><span> static const char * const osmohnodeb_copyright =</span><br><span>         "OsmoHNodeB - Osmocom 3G Home NodeB implementation\r\n"</span><br><span>@@ -264,7 +265,7 @@</span><br><span>              exit(1);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rc = hnb_connect(g_hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = hnb_iuh_connect(g_hnb);</span><br><span>         if (rc < 0) {</span><br><span>             perror("Error connecting to Iuh port");</span><br><span>            exit(1);</span><br><span>diff --git a/src/osmo-hnodeb/rua.c b/src/osmo-hnodeb/rua.c</span><br><span>index 0dd8c3a..907cd60 100644</span><br><span>--- a/src/osmo-hnodeb/rua.c</span><br><span>+++ b/src/osmo-hnodeb/rua.c</span><br><span>@@ -28,6 +28,7 @@</span><br><span> </span><br><span> #include <osmocom/hnodeb/rua.h></span><br><span> #include <osmocom/hnodeb/ranap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/iuh.h></span><br><span> </span><br><span> int hnb_tx_dt(struct hnb *hnb, struct msgb *txm)</span><br><span> {</span><br><span>diff --git a/src/osmo-hnodeb/vty.c b/src/osmo-hnodeb/vty.c</span><br><span>index 61a3f4c..e11fc2d 100644</span><br><span>--- a/src/osmo-hnodeb/vty.c</span><br><span>+++ b/src/osmo-hnodeb/vty.c</span><br><span>@@ -34,6 +34,7 @@</span><br><span> #include <osmocom/ranap/ranap_common.h></span><br><span> #include <osmocom/ranap/ranap_msg_factory.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/iuh.h></span><br><span> #include <osmocom/hnodeb/hnbap.h></span><br><span> #include <osmocom/hnodeb/ranap.h></span><br><span> #include <osmocom/hnodeb/vty.h></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26341">change 26341</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/c/osmo-hnodeb/+/26341"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hnodeb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6e94210ab06a34b70c61bb074c58d7b0f4ee75de </div>
<div style="display:none"> Gerrit-Change-Number: 26341 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>