<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-iuh/+/16369">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: add SABP support to HNBGW<br><br>Change-Id: I2d91de2e37770e3635abe8004ac183857d8a6ff2<br>---<br>M include/osmocom/iuh/hnbgw.h<br>M src/Makefile.am<br>M src/hnbgw.c<br>A src/hnbgw_sabp.c<br>4 files changed, 136 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-iuh refs/changes/69/16369/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/iuh/hnbgw.h b/include/osmocom/iuh/hnbgw.h</span><br><span>index 4848c2f..344d20a 100644</span><br><span>--- a/include/osmocom/iuh/hnbgw.h</span><br><span>+++ b/include/osmocom/iuh/hnbgw.h</span><br><span>@@ -16,6 +16,7 @@</span><br><span>         DHNBAP,</span><br><span>      DRUA,</span><br><span>        DRANAP,</span><br><span style="color: hsl(120, 100%, 40%);">+       DSABP,</span><br><span> };</span><br><span> </span><br><span> enum hnb_ctrl_node {</span><br><span>@@ -96,6 +97,8 @@</span><br><span>         uint16_t hnbap_stream;</span><br><span>       /*! SCTP stream ID for RUA */</span><br><span>        uint16_t rua_stream;</span><br><span style="color: hsl(120, 100%, 40%);">+  /*! SCTP stream ID for SABP */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t sabp_stream;</span><br><span> </span><br><span>    /*! True if a HNB-REGISTER-REQ from this HNB has been accepted. Note that</span><br><span>     * this entire data structure is freed if the HNB sends HNB-DE-REGISTER-REQ. */</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index b1f8153..24977c2 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -85,13 +85,13 @@</span><br><span>                    rua_msg_factory.c \</span><br><span>                  hnbgw.c hnbgw_hnbap.c hnbgw_rua.c hnbgw_ranap.c \</span><br><span>                    hnbgw_vty.c \</span><br><span style="color: hsl(0, 100%, 40%);">-                   context_map.c hnbgw_cn.c</span><br><span style="color: hsl(120, 100%, 40%);">+              context_map.c hnbgw_cn.c hnbgw_sabp.c</span><br><span> </span><br><span> osmo_hnbgw_LDADD = $(OSMOCORE_LIBS) $(OSMOGSM_LIBS) $(OSMOVTY_LIBS) $(OSMOCTRL_LIBS) \</span><br><span>                $(ASN1C_LIBS) $(OSMOSIGTRAN_LIBS) \</span><br><span>                  $(OSMONETIF_LIBS) \</span><br><span>                  hnbap/libosmo-asn1-hnbap.a rua/libosmo-asn1-rua.a \</span><br><span style="color: hsl(0, 100%, 40%);">-             libosmo-ranap.la</span><br><span style="color: hsl(120, 100%, 40%);">+              libosmo-ranap.la libosmo-sabp.la</span><br><span> </span><br><span> </span><br><span> regen: regenerate-from-asn1-source</span><br><span>diff --git a/src/hnbgw.c b/src/hnbgw.c</span><br><span>index 9dc67a2..d8ca123 100644</span><br><span>--- a/src/hnbgw.c</span><br><span>+++ b/src/hnbgw.c</span><br><span>@@ -258,6 +258,9 @@</span><br><span>             rc = hnbgw_rua_rx(hnb, msg);</span><br><span>                 break;</span><br><span>       case IUH_PPI_SABP:</span><br><span style="color: hsl(120, 100%, 40%);">+            hnb->sabp_stream = msgb_sctp_stream(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = hnbgw_sabp_rx(hnb, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span>       case IUH_PPI_RNA:</span><br><span>    case IUH_PPI_PUA:</span><br><span>            LOGP(DMAIN, LOGL_ERROR, "Unimplemented SCTP PPID=%lu received\n",</span><br><span>@@ -354,6 +357,11 @@</span><br><span>           .color = "",</span><br><span>               .description = "RAN Application Part",</span><br><span>     },</span><br><span style="color: hsl(120, 100%, 40%);">+    [DSABP] = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .name = "DSABP", .loglevel = LOGL_DEBUG, .enabled = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+              .color = "",</span><br><span style="color: hsl(120, 100%, 40%);">+                .description = "Service Area Broadcast Protocol",</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span> };</span><br><span> </span><br><span> static const struct log_info hnbgw_log_info = {</span><br><span>@@ -588,6 +596,7 @@</span><br><span>        }</span><br><span> </span><br><span>        ranap_set_log_area(DRANAP);</span><br><span style="color: hsl(120, 100%, 40%);">+   sabp_set_log_area(DSABP);</span><br><span> </span><br><span>        rc = hnbgw_cnlink_init(g_hnb_gw, "127.0.0.1", M3UA_PORT, NULL);</span><br><span>    if (rc < 0) {</span><br><span>diff --git a/src/hnbgw_sabp.c b/src/hnbgw_sabp.c</span><br><span>new file mode 100644</span><br><span>index 0000000..95177ac</span><br><span>--- /dev/null</span><br><span>+++ b/src/hnbgw_sabp.c</span><br><span>@@ -0,0 +1,122 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* hnb-gw specific code for SABP (Service Area Broadcast Protocol) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2019 by Harald Welte <laforge@gnumonks.org></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/licenses/>.</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 <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.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/sigtran/sccp_sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_helpers.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asn1helpers.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/iuh/hnbgw.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/iuh/hnbgw_ranap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sabp/sabp_common.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sabp/sabp_ies_defs.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int hnbgw_sabp_tx(struct hnb_context *ctx, struct msgb *msg)</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 -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_sctp_ppid(msg) = IUH_PPI_SABP;</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_stream_srv_send(ctx->conn, msg);</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%);">+static int sabp_rx_initiating_msg(struct msgb *msg, SABP_InitiatingMessage_t *imsg)</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%);">+     switch (imsg->procedureCode) {</span><br><span style="color: hsl(120, 100%, 40%);">+     default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DSABP, LOGL_NOTICE, "Unknown SABP Procedure %lu\n", imsg->procedureCode);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = -1;</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%);">+   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 sabp_rx_successful_outcome_msg(struct msgb *msg, SABP_SuccessfulOutcome_t *in)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME */</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DSABP, LOGL_NOTICE, "Unexpected SABP Successful Outcome\n");</span><br><span style="color: hsl(120, 100%, 40%);">+   return -1;</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 sabp_rx_unsuccessful_outcome_msg(struct msgb *msg, SABP_UnsuccessfulOutcome_t *in)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME */</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DSABP, LOGL_NOTICE, "Unexpected SABP Unsucessful Outcome\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  return -1;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int _hnbgw_sabp_rx(struct msgb *msg, SABP_SABP_PDU_t *pdu)</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%);">+     /* it's a bit odd that we can't dispatch on procedure code, but</span><br><span style="color: hsl(120, 100%, 40%);">+        * that's not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (pdu->present) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case SABP_SABP_PDU_PR_initiatingMessage:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = sabp_rx_initiating_msg(msg, &pdu->choice.initiatingMessage);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SABP_SABP_PDU_PR_successfulOutcome:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = sabp_rx_successful_outcome_msg(msg, &pdu->choice.successfulOutcome);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SABP_SABP_PDU_PR_unsuccessfulOutcome:</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = sabp_rx_unsuccessful_outcome_msg(msg, &pdu->choice.unsuccessfulOutcome);</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(DSABP, LOGL_NOTICE, "Unknown SABP presence %u\n", pdu->present);</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = -1;</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%);">+   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%);">+int hnbgw_sabp_rx(struct hnb_context *hnb, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      SABP_SABP_PDU_t _pdu, *pdu = &_pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+       asn_dec_rval_t dec_ret;</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%);">+     /* decode and handle to _hnbgw_hnbap_rx() */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        memset(pdu, 0, sizeof(*pdu));</span><br><span style="color: hsl(120, 100%, 40%);">+ dec_ret = aper_decode(NULL, &asn_DEF_SABP_SABP_PDU, (void **) &pdu,</span><br><span style="color: hsl(120, 100%, 40%);">+                         msg->data, msgb_length(msg), 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (dec_ret.code != RC_OK) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DSABP, LOGL_ERROR, "Error in ASN.1 decode\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return -1;</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%);">+   rc = _hnbgw_sabp_rx(msg, pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-iuh/+/16369">change 16369</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-iuh/+/16369"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-iuh </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2d91de2e37770e3635abe8004ac183857d8a6ff2 </div>
<div style="display:none"> Gerrit-Change-Number: 16369 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>