<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/22110">View Change</a></p><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>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, 92 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/10/22110/1</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 da819d5..ed09e29 100644</span><br><span>--- a/include/osmocom/sgsn/debug.h</span><br><span>+++ b/include/osmocom/sgsn/debug.h</span><br><span>@@ -40,6 +40,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..9f62383</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 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 19039f6..0fbd4a6 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(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..bbf75b2</span><br><span>--- /dev/null</span><br><span>+++ b/src/sgsn/sgsn_rim.c</span><br><span>@@ -0,0 +1,78 @@</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 msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct bssgp_rim_routing_info dest_rim_ri;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct bssgp_rim_routing_info src_rim_ri;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bssgp_ran_information_pdu 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%);">+     rc = bssgp_parse_rim_pdu(&pdu, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Parse destination and source cell identifer */</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = bssgp_parse_rim_ri(&dest_rim_ri, pdu.routing_info_dest, pdu.routing_info_dest_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DRIM, LOGL_ERROR, "BSSGP RIM (NSEI=%u) cannot decode Destination Cell Identifier\n", nsei);</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%);">+   rc = bssgp_parse_rim_ri(&src_rim_ri, pdu.routing_info_src, pdu.routing_info_src_len);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DRIM, LOGL_ERROR, "BSSGP RIM (NSEI=%u) cannot decode Source Cell Identifier\n", nsei);</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%);">+   /* 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 (dest_rim_ri.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%);">+           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 (src_rim_ri.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%);">+             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(&dest_rim_ri, nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (d_nsei < 0) {</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%);">+   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: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>