<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26018">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  pespin: Verified
  laforge: Looks good to me, but someone else must approve
  fixeria: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">use osmo_stream_cli to manage sctp Iuh conn<br><br>Let's use already available functionality to handle the conn for us.<br>This is specially useful since we gain a connect_cb.<br><br>Change-Id: I9d884231577aa47af22cd6319130ca5c9e595d61<br>---<br>M include/osmocom/hnodeb/hnodeb.h<br>M src/osmo-hnodeb/hnb.c<br>2 files changed, 45 insertions(+), 53 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/hnodeb/hnodeb.h b/include/osmocom/hnodeb/hnodeb.h</span><br><span>index 9da6044..cca7f35 100644</span><br><span>--- a/include/osmocom/hnodeb/hnodeb.h</span><br><span>+++ b/include/osmocom/hnodeb/hnodeb.h</span><br><span>@@ -59,8 +59,7 @@</span><br><span>             uint16_t local_port;</span><br><span>                 char *remote_addr;</span><br><span>           uint16_t remote_port;</span><br><span style="color: hsl(0, 100%, 40%);">-           /*! SCTP socket + write queue for Iuh to this specific HNB */</span><br><span style="color: hsl(0, 100%, 40%);">-           struct osmo_wqueue wqueue;</span><br><span style="color: hsl(120, 100%, 40%);">+            struct osmo_stream_cli *client;</span><br><span>      } iuh;</span><br><span> </span><br><span>   uint16_t rnc_id;</span><br><span>@@ -72,6 +71,7 @@</span><br><span>         } cs;</span><br><span> };</span><br><span> struct hnb *hnb_alloc(void *tall_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_free(struct hnb *hnb);</span><br><span> int hnb_connect(struct hnb *hnb);</span><br><span> </span><br><span> int hnb_iuh_send(struct hnb *hnb, struct msgb *msg);</span><br><span>diff --git a/src/osmo-hnodeb/hnb.c b/src/osmo-hnodeb/hnb.c</span><br><span>index 9a86019..e77f1aa 100644</span><br><span>--- a/src/osmo-hnodeb/hnb.c</span><br><span>+++ b/src/osmo-hnodeb/hnb.c</span><br><span>@@ -36,22 +36,10 @@</span><br><span> #include <osmocom/hnodeb/rua.h></span><br><span> #include <osmocom/hnodeb/hnodeb.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int sctp_sock_init(int fd)</span><br><span style="color: hsl(120, 100%, 40%);">+static int hnb_iuh_read_cb(struct osmo_stream_cli *conn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct sctp_event_subscribe event;</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%);">- /* subscribe for all events */</span><br><span style="color: hsl(0, 100%, 40%);">-  memset((uint8_t *)&event, 1, sizeof(event));</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS,</span><br><span style="color: hsl(0, 100%, 40%);">-                  &event, sizeof(event));</span><br><span style="color: hsl(0, 100%, 40%);">-</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_read_cb(struct osmo_fd *fd)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct hnb *hnb = fd->data;</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>    struct sctp_sndrcvinfo sinfo;</span><br><span>        struct msgb *msg = msgb_alloc(IUH_MSGB_SIZE, "Iuh rx");</span><br><span>    int flags = 0;</span><br><span>@@ -65,15 +53,11 @@</span><br><span>         if (rc < 0) {</span><br><span>             LOGP(DMAIN, LOGL_ERROR, "Error during sctp_recvmsg()\n");</span><br><span>          /* FIXME: clean up after disappeared HNB */</span><br><span style="color: hsl(0, 100%, 40%);">-             close(fd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_fd_unregister(fd);</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stream_cli_close(conn);</span><br><span>                 return rc;</span><br><span>   } else if (rc == 0) {</span><br><span>                LOGP(DMAIN, LOGL_INFO, "Connection to HNB closed\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         close(fd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_fd_unregister(fd);</span><br><span style="color: hsl(0, 100%, 40%);">-         fd->fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stream_cli_close(conn);</span><br><span>                 return -1;</span><br><span>   } else {</span><br><span>             msgb_put(msg, rc);</span><br><span>@@ -114,42 +98,48 @@</span><br><span>    return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int hnb_iuh_write_cb(struct osmo_fd *fd, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+static int hnb_iuh_connect_cb(struct osmo_stream_cli *cli)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   /* struct hnb *ctx = fd->data; */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct sctp_sndrcvinfo sinfo = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .sinfo_ppid = htonl(msgb_sctp_ppid(msg)),</span><br><span style="color: hsl(0, 100%, 40%);">-               .sinfo_stream = 0,</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_DEBUG, "Sending: %s\n", osmo_hexdump(msgb_data(msg), msgb_length(msg)));</span><br><span style="color: hsl(0, 100%, 40%);">-     rc = sctp_send(fd->fd, msgb_data(msg), msgb_length(msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                     &sinfo, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- /* we don't need to msgb_free(), write_queue does this for us */</span><br><span style="color: hsl(0, 100%, 40%);">-    return rc;</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%);">+       return 0;</span><br><span> }</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(120, 100%, 40%);">+      struct osmo_stream_cli *cli;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       hnb = talloc_zero(tall_ctx, struct hnb);</span><br><span>     if (!hnb)</span><br><span>            return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        hnb->iuh.local_addr = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+        hnb->iuh.local_addr = talloc_strdup(hnb, "0.0.0.0");</span><br><span>    hnb->iuh.local_port = 0;</span><br><span>  hnb->iuh.remote_addr = talloc_strdup(hnb, "127.0.0.1");</span><br><span>         hnb->iuh.remote_port = IUH_DEFAULT_SCTP_PORT;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_wqueue_init(&hnb->iuh.wqueue, 16);</span><br><span style="color: hsl(0, 100%, 40%);">-  hnb->iuh.wqueue.bfd.data = hnb;</span><br><span style="color: hsl(0, 100%, 40%);">-      hnb->iuh.wqueue.read_cb = hnb_iuh_read_cb;</span><br><span style="color: hsl(0, 100%, 40%);">-   hnb->iuh.wqueue.write_cb = hnb_iuh_write_cb;</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> </span><br><span>      return hnb;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_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%);">+             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%);">+     talloc_free(hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int hnb_connect(struct hnb *hnb)</span><br><span> {</span><br><span>      int rc;</span><br><span>@@ -157,21 +147,23 @@</span><br><span>      LOGP(DMAIN, LOGL_INFO, "Iuh Connect: %s[:%u] => %s[:%u]\n",</span><br><span>          hnb->iuh.local_addr, hnb->iuh.local_port, hnb->iuh.remote_addr, hnb->iuh.remote_port);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     rc = osmo_sock_init2_ofd(&hnb->iuh.wqueue.bfd, AF_INET, SOCK_STREAM, IPPROTO_SCTP,</span><br><span style="color: hsl(0, 100%, 40%);">-                          hnb->iuh.local_addr, hnb->iuh.local_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                         hnb->iuh.remote_addr, hnb->iuh.remote_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSMO_SOCK_F_BIND |OSMO_SOCK_F_CONNECT);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      sctp_sock_init(hnb->iuh.wqueue.bfd.fd);</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>    return 0;</span><br><span> }</span><br><span> </span><br><span> int hnb_iuh_send(struct hnb *hnb, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = osmo_wqueue_enqueue(&hnb->iuh.wqueue, msg);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</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(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> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26018">change 26018</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/+/26018"/><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: I9d884231577aa47af22cd6319130ca5c9e595d61 </div>
<div style="display:none"> Gerrit-Change-Number: 26018 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>