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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sgsn_rim: Add routing for (GERAN) BSSGP RIM messages<br><br>The SGSN currently does not forward BSSGP RIM messages.<br><br>Related: SYS#5103<br>Depends: libosmocore Icd667f41d5735de56cd9fb257670337c679dd258<br>Change-Id: I6fde8ab8955660b48000ca1b650cfc7c7b2e24ba<br>---<br>M include/osmocom/sgsn/Makefile.am<br>M include/osmocom/sgsn/debug.h<br>A include/osmocom/sgsn/sgsn_rim.h<br>M src/sgsn/Makefile.am<br>M src/sgsn/sgsn_main.c<br>A src/sgsn/sgsn_rim.c<br>6 files changed, 81 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/Makefile.am b/include/osmocom/sgsn/Makefile.am</span><br><span>index 3fdb6b3..95c811a 100644</span><br><span>--- a/include/osmocom/sgsn/Makefile.am</span><br><span>+++ b/include/osmocom/sgsn/Makefile.am</span><br><span>@@ -24,6 +24,7 @@</span><br><span>   gprs_utils.h \</span><br><span>       gtphub.h \</span><br><span>   sgsn.h \</span><br><span style="color: hsl(120, 100%, 40%);">+      sgsn_rim.h \</span><br><span>         signal.h \</span><br><span>   slhc.h \</span><br><span>     v42bis.h \</span><br><span>diff --git a/include/osmocom/sgsn/debug.h b/include/osmocom/sgsn/debug.h</span><br><span>index 9a686cb..37e4a09 100644</span><br><span>--- a/include/osmocom/sgsn/debug.h</span><br><span>+++ b/include/osmocom/sgsn/debug.h</span><br><span>@@ -27,6 +27,7 @@</span><br><span>  DSIGTRAN,</span><br><span>    DGTP,</span><br><span>        DOBJ,</span><br><span style="color: hsl(120, 100%, 40%);">+ DRIM,</span><br><span>        Debug_LastEntry,</span><br><span> };</span><br><span> </span><br><span>diff --git a/include/osmocom/sgsn/sgsn_rim.h b/include/osmocom/sgsn/sgsn_rim.h</span><br><span>new file mode 100644</span><br><span>index 0000000..ca3660b</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/sgsn/sgsn_rim.h</span><br><span>@@ -0,0 +1,3 @@</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%);">+int sgsn_rim_rx(struct osmo_bssgp_prim *bp, struct msgb *msg);</span><br><span>diff --git a/src/sgsn/Makefile.am b/src/sgsn/Makefile.am</span><br><span>index 6a7392b..8738986 100644</span><br><span>--- a/src/sgsn/Makefile.am</span><br><span>+++ b/src/sgsn/Makefile.am</span><br><span>@@ -62,6 +62,7 @@</span><br><span>       sgsn_auth.c \</span><br><span>        gprs_subscriber.c \</span><br><span>  sgsn_cdr.c \</span><br><span style="color: hsl(120, 100%, 40%);">+  sgsn_rim.c \</span><br><span>         slhc.c \</span><br><span>     gprs_llc_xid.c \</span><br><span>     v42bis.c \</span><br><span>diff --git a/src/sgsn/sgsn_main.c b/src/sgsn/sgsn_main.c</span><br><span>index 075d59c..c3a6061 100644</span><br><span>--- a/src/sgsn/sgsn_main.c</span><br><span>+++ b/src/sgsn/sgsn_main.c</span><br><span>@@ -67,6 +67,7 @@</span><br><span> #include <osmocom/ctrl/ports.h></span><br><span> </span><br><span> #include <gtp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/sgsn_rim.h></span><br><span> </span><br><span> #include "../../bscconfig.h"</span><br><span> </span><br><span>@@ -120,6 +121,8 @@</span><br><span>                 break;</span><br><span>       case SAP_BSSGP_NM:</span><br><span>           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SAP_BSSGP_RIM:</span><br><span style="color: hsl(120, 100%, 40%);">+           return sgsn_rim_rx(bp, oph->msg);</span><br><span>         }</span><br><span>    return 0;</span><br><span> }</span><br><span>@@ -311,6 +314,11 @@</span><br><span>                .description = "GPRS Tunnelling Protocol (GTP)",</span><br><span>           .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span>       },</span><br><span style="color: hsl(120, 100%, 40%);">+    [DRIM] = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .name = "DRIM",</span><br><span style="color: hsl(120, 100%, 40%);">+             .description = "RAN Information Management (RIM)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span> };</span><br><span> </span><br><span> static const struct log_info gprs_log_info = {</span><br><span>diff --git a/src/sgsn/sgsn_rim.c b/src/sgsn/sgsn_rim.c</span><br><span>new file mode 100644</span><br><span>index 0000000..71e6d98</span><br><span>--- /dev/null</span><br><span>+++ b/src/sgsn/sgsn_rim.c</span><br><span>@@ -0,0 +1,67 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.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%);">+#include <stdint.h></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/gsm/tlv.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/gprs_ns.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/gprs_bssgp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/gprs_bssgp_rim.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/sgsn_rim.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Find an NSEI for the destination cell, this function works only for GERAN! */</span><br><span style="color: hsl(120, 100%, 40%);">+static int find_dest_nsei_geran(struct bssgp_rim_routing_info *dest_rim_ri, uint16_t nsei)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bssgp_bvc_ctx *bvc_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(dest_rim_ri->discr == BSSGP_RIM_ROUTING_INFO_GERAN);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bvc_ctx = btsctx_by_raid_cid(&dest_rim_ri->geran.raid, dest_rim_ri->geran.cid);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bvc_ctx) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DRIM, LOGL_ERROR, "BSSGP RIM (NSEI=%u) cannot find NSEI for destination cell\n", nsei);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return bvc_ctx->nsei;</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 sgsn_rim_rx(struct osmo_bssgp_prim *bp, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct bssgp_ran_information_pdu *pdu = &bp->u.rim_pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+        int d_nsei;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t nsei = msgb_nsei(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* At the moment we only support GERAN, so we block all other network</span><br><span style="color: hsl(120, 100%, 40%);">+  * types here. */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (pdu->routing_info_dest.discr != BSSGP_RIM_ROUTING_INFO_GERAN) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DRIM, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "BSSGP RIM (NSEI=%u) only GERAN supported, destination cell is not a GERAN cell -- rejected.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+           /* At the moment we can only handle GERAN addresses, any other</span><br><span style="color: hsl(120, 100%, 40%);">+                 * type of address will be consideres as an invalid address.</span><br><span style="color: hsl(120, 100%, 40%);">+           * see also: 3GPP TS 48.018, section 8c.3.1.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+              return bssgp_tx_status(BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (pdu->routing_info_src.discr != BSSGP_RIM_ROUTING_INFO_GERAN) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DRIM, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "BSSGP RIM (NSEI=%u) only GERAN supported, source cell is not a GERAN cell -- rejected.\n", nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* See comment above */</span><br><span style="color: hsl(120, 100%, 40%);">+               return bssgp_tx_status(BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</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%);">+   d_nsei = find_dest_nsei_geran(&pdu->routing_info_dest, nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (d_nsei < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DRIM, LOGL_NOTICE, "BSSGP RIM (NSEI=%u) Cell %s unknown to this sgsn\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    nsei, bssgp_rim_ri_name(&pdu->routing_info_dest));</span><br><span style="color: hsl(120, 100%, 40%);">+                /* In case of an invalid destination address we respond with</span><br><span style="color: hsl(120, 100%, 40%);">+           * a BSSGP STATUS PDU, see also: 3GPP TS 48.018, section 8c.3.1.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+          return bssgp_tx_status(BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</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%);">+   /* Forward PDU as it is to the correct interface */</span><br><span style="color: hsl(120, 100%, 40%);">+   return bssgp_tx_rim(pdu, (uint16_t) d_nsei);</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-sgsn/+/22110">change 22110</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-sgsn/+/22110"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6fde8ab8955660b48000ca1b650cfc7c7b2e24ba </div>
<div style="display:none"> Gerrit-Change-Number: 22110 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@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>