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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">library/GSUP_Types.ttcn: fix MSISDN / SMSC coding in SM-RP-OA/DA<br><br>Unlike IMSI, both MSISDN and SMSC address in SM-RP-OA/DA not only<br>contain the BCD encoded digits, but also a little header with<br>NPI (Numbering Plan Identification), ToN (Type of Number), and<br>Extension fields.<br><br>Change-Id: I3f55834489f3e613f541cf1e216027e8d48ccaf0<br>Related: OS#4324<br>---<br>M library/GSUP_Types.ttcn<br>M library/Osmocom_Types.ttcn<br>M msc/MSC_Tests.ttcn<br>3 files changed, 57 insertions(+), 15 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn</span><br><span>index 8977d9f..d4b1db1 100644</span><br><span>--- a/library/GSUP_Types.ttcn</span><br><span>+++ b/library/GSUP_Types.ttcn</span><br><span>@@ -869,6 +869,38 @@</span><br><span>   OSMO_GSUP_SM_RP_ODA_ID_NULL             ('FF'O)</span><br><span> } with { variant "FIELDLENGTH(8)" };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* See 3GPP TS 24.011, figures 8.5 and 8.6 */</span><br><span style="color: hsl(120, 100%, 40%);">+type record GSUP_SM_RP_Addr {</span><br><span style="color: hsl(120, 100%, 40%);">+   BIT1            ext, /* Extension? */</span><br><span style="color: hsl(120, 100%, 40%);">+ BIT3            ton, /* Type of Number */</span><br><span style="color: hsl(120, 100%, 40%);">+     BIT4            npi, /* Numbering Plan Identification */</span><br><span style="color: hsl(120, 100%, 40%);">+      hexstring       number length (1..20)</span><br><span style="color: hsl(120, 100%, 40%);">+} with {</span><br><span style="color: hsl(120, 100%, 40%);">+       variant "PADDING(yes)";</span><br><span style="color: hsl(120, 100%, 40%);">+     variant "PADDING_PATTERN('1111'B)"</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%);">+private function f_pad_SM_RP_Addr(template hexstring number)</span><br><span style="color: hsl(120, 100%, 40%);">+return template hexstring {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isvalue(number) and not istemplatekind(number, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+               return f_pad_bcd_number(valueof(number));</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              return number;</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%);">+template GSUP_SM_RP_Addr t_GSUP_SM_RP_Addr(template hexstring number,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template BIT4 npi := '0001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         template BIT3 ton := '001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          template BIT1 ext := '1'B) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    ext := ext,</span><br><span style="color: hsl(120, 100%, 40%);">+   ton := ton,</span><br><span style="color: hsl(120, 100%, 40%);">+   npi := npi,</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Work around TITAN's padding problems: encoding works fine,</span><br><span style="color: hsl(120, 100%, 40%);">+      * but it does not consider 'F'H as padding in decoded data. */</span><br><span style="color: hsl(120, 100%, 40%);">+       number := f_pad_SM_RP_Addr(number)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /**</span><br><span>  * SM-RP-DA represents the SM Destination Address, see 7.6.8.1.</span><br><span>  * It can be either of the following:</span><br><span>@@ -879,9 +911,9 @@</span><br><span>  *  - service centre address</span><br><span>  */</span><br><span> type union GSUP_SM_RP_DA_ID {</span><br><span style="color: hsl(0, 100%, 40%);">-        hexstring       imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-   hexstring       msisdn,</span><br><span style="color: hsl(0, 100%, 40%);">- hexstring       smsc_addr</span><br><span style="color: hsl(120, 100%, 40%);">+     hexstring               imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP_SM_RP_Addr         msisdn,</span><br><span style="color: hsl(120, 100%, 40%);">+       GSUP_SM_RP_Addr         smsc_addr</span><br><span> };</span><br><span> </span><br><span> type record GSUP_SM_RP_DA {</span><br><span>@@ -904,20 +936,20 @@</span><br><span>   id_enc := { imsi := imsi }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(hexstring msisdn) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(GSUP_SM_RP_Addr msisdn) := {</span><br><span>        id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,</span><br><span>    id_enc := { msisdn := msisdn }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template hexstring msisdn) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {</span><br><span>      id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,</span><br><span>    id_enc := { msisdn := msisdn }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(hexstring smsc_addr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {</span><br><span>        id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,</span><br><span>         id_enc := { smsc_addr := smsc_addr }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template hexstring smsc_addr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {</span><br><span>    id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,</span><br><span>         id_enc := { smsc_addr := smsc_addr }</span><br><span> }</span><br><span>@@ -953,8 +985,8 @@</span><br><span>  *  - service centre address</span><br><span>  */</span><br><span> type union GSUP_SM_RP_OA_ID {</span><br><span style="color: hsl(0, 100%, 40%);">- hexstring       msisdn,</span><br><span style="color: hsl(0, 100%, 40%);">- hexstring       smsc_addr</span><br><span style="color: hsl(120, 100%, 40%);">+     GSUP_SM_RP_Addr         msisdn,</span><br><span style="color: hsl(120, 100%, 40%);">+       GSUP_SM_RP_Addr         smsc_addr</span><br><span> };</span><br><span> </span><br><span> type record GSUP_SM_RP_OA {</span><br><span>@@ -967,20 +999,20 @@</span><br><span>   )"</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(hexstring msisdn) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(GSUP_SM_RP_Addr msisdn) := {</span><br><span>  id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,</span><br><span>    id_enc := { msisdn := msisdn }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template hexstring msisdn) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {</span><br><span>      id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,</span><br><span>    id_enc := { msisdn := msisdn }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(hexstring smsc_addr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {</span><br><span>        id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,</span><br><span>         id_enc := { smsc_addr := smsc_addr }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template hexstring smsc_addr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {</span><br><span>    id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,</span><br><span>         id_enc := { smsc_addr := smsc_addr }</span><br><span> }</span><br><span>diff --git a/library/Osmocom_Types.ttcn b/library/Osmocom_Types.ttcn</span><br><span>index 046a9ea..2e71123 100644</span><br><span>--- a/library/Osmocom_Types.ttcn</span><br><span>+++ b/library/Osmocom_Types.ttcn</span><br><span>@@ -170,5 +170,13 @@</span><br><span>        return str;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_pad_bcd_number(hexstring number) return hexstring {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (lengthof(number) mod 2 != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            return number & 'F'H;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              return number;</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> </span><br><span> } with { encode "RAW"; variant "FIELDORDER(msb)" }</span><br><span>diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn</span><br><span>index 439d7f1..f430335 100644</span><br><span>--- a/msc/MSC_Tests.ttcn</span><br><span>+++ b/msc/MSC_Tests.ttcn</span><br><span>@@ -2268,14 +2268,16 @@</span><br><span> /* Helper for sending MT SMS over GSUP */</span><br><span> private function f_gsup_forwardSM_req(SmsParameters spars, OCT1 mms := '00'O)</span><br><span> runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   var GSUP_SM_RP_Addr msisdn := valueof(t_GSUP_SM_RP_Addr(g_pars.msisdn));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   GSUP.send(ts_GSUP_MT_FORWARD_SM_REQ(</span><br><span>                 imsi := g_pars.imsi,</span><br><span>                 /* NOTE: MSC should assign RP-MR itself */</span><br><span>           sm_rp_mr := 'FF'O,</span><br><span>           /* FIXME: extract SM-RP-DA from spars.rp.dest */</span><br><span>             /* TODO: fix encoding of ts_GSUP_SM_RP_DA_IMSI */</span><br><span style="color: hsl(0, 100%, 40%);">-               sm_rp_da := valueof(ts_GSUP_SM_RP_DA_MSISDN(g_pars.msisdn)),</span><br><span style="color: hsl(0, 100%, 40%);">-            sm_rp_oa := valueof(ts_GSUP_SM_RP_OA_SMSC_ADDR(g_pars.msisdn)),</span><br><span style="color: hsl(120, 100%, 40%);">+               sm_rp_da := valueof(ts_GSUP_SM_RP_DA_MSISDN(msisdn)),</span><br><span style="color: hsl(120, 100%, 40%);">+         sm_rp_oa := valueof(ts_GSUP_SM_RP_OA_SMSC_ADDR(msisdn)),</span><br><span>             /* Encoded SMS TPDU (taken from Wireshark)</span><br><span>            * FIXME: we should encode spars somehow */</span><br><span>          sm_rp_ui := '00068021436500008111328130858200'O,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/16565">change 16565</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-ttcn3-hacks/+/16565"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I3f55834489f3e613f541cf1e216027e8d48ccaf0 </div>
<div style="display:none"> Gerrit-Change-Number: 16565 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>