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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hlr: add tests for GSUP proxy routing<br><br>GSUP proxy routing, as it is implemented in an upcoming osmo-hlr patch,<br>requires that osmo-hlr returns a received Source Name IE back as Destination<br>Name IE. Add tests for these, for various situations.<br><br>These tests pass since GSUP request handling with request->response association<br>was introduced to osmo-hlr in I179ebb0385b5b355f4740e14d43be97bf93622e3.<br><br>Implement this by adding a source_name to the g_pars, which should be sent out<br>in ts_GSUP_* to osmo-hlr, and expected back as destination_name in returned<br>messages.<br><br>Add source_name and destination_name to various templates, with default :=<br>omit.<br><br>Add f_gen_ts_ies() and f_gen_tr_ies() to compose expected IEs more generically.<br><br>Change-Id: I3728776d862c5e5fa7628ca28d74c1ef247459fa<br>---<br>M hlr/HLR_Tests.ttcn<br>M library/GSUP_Types.ttcn<br>2 files changed, 245 insertions(+), 69 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn</span><br><span>index 0dd3cad..06354b9 100644</span><br><span>--- a/hlr/HLR_Tests.ttcn</span><br><span>+++ b/hlr/HLR_Tests.ttcn</span><br><span>@@ -110,26 +110,38 @@</span><br><span> </span><br><span> type record HLR_ConnHdlrPars {</span><br><span>       HlrSubscriber sub,</span><br><span style="color: hsl(0, 100%, 40%);">-      HLR_ConnHdlrParsUssd ussd optional</span><br><span style="color: hsl(120, 100%, 40%);">+    HLR_ConnHdlrParsUssd ussd optional,</span><br><span style="color: hsl(120, 100%, 40%);">+   octetstring source_name optional</span><br><span> }</span><br><span> </span><br><span> type record HLR_ConnHdlrParsUssd {</span><br><span>      OCT4 sid</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) HLR_ConnHdlrPars t_Pars(hexstring imsi, hexstring msisdn := ''H) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HLR_ConnHdlrPars t_Pars(hexstring imsi, hexstring msisdn := ''H,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template (omit) octetstring source_name := omit) := {</span><br><span>       sub := {</span><br><span>             imsi := imsi,</span><br><span>                msisdn := msisdn,</span><br><span>            aud2g := omit,</span><br><span>               aud3g := omit</span><br><span>        },</span><br><span style="color: hsl(0, 100%, 40%);">-      ussd := omit</span><br><span style="color: hsl(120, 100%, 40%);">+  ussd := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ source_name := source_name</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HLR_ConnHdlrPars t_Pars_via_proxy(hexstring imsi, hexstring msisdn := ''H) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       t_Pars(imsi, msisdn, source_name := char2oct("the-source\n"));</span><br><span> </span><br><span> template (value) HLR_ConnHdlrPars t_Pars_sub(HlrSubscriber sub) := {</span><br><span>         sub := sub,</span><br><span style="color: hsl(0, 100%, 40%);">-     ussd := omit</span><br><span style="color: hsl(120, 100%, 40%);">+  ussd := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ source_name := omit</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 (value) HLR_ConnHdlrPars t_Pars_sub_via_proxy(HlrSubscriber sub) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      sub := sub,</span><br><span style="color: hsl(120, 100%, 40%);">+   ussd := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ source_name := char2oct("the-source\n")</span><br><span> }</span><br><span> </span><br><span> type function void_fn() runs on HLR_ConnHdlr;</span><br><span>@@ -530,7 +542,8 @@</span><br><span> </span><br><span> function f_perform_UL(hexstring imsi, template hexstring msisdn,</span><br><span>                    template (omit) integer exp_err_cause := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-                  GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS)</span><br><span style="color: hsl(120, 100%, 40%);">+                  GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,</span><br><span style="color: hsl(120, 100%, 40%);">+                  template (omit) octetstring source_name := omit)</span><br><span> runs on HLR_ConnHdlr return GSUP_PDU {</span><br><span>   var GSUP_PDU ret;</span><br><span>    timer T := 3.0;</span><br><span>@@ -540,34 +553,34 @@</span><br><span>              exp_fail := true;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   GSUP.send(valueof(ts_GSUP_UL_REQ(imsi, dom)));</span><br><span style="color: hsl(120, 100%, 40%);">+        GSUP.send(valueof(ts_GSUP_UL_REQ(imsi, dom, source_name := source_name)));</span><br><span>   T.start;</span><br><span>     alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, exp_err_cause)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+        [exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, exp_err_cause, destination_name := source_name)) -> value ret {</span><br><span>              setverdict(pass);</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, ?)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+    [exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, ?, destination_name := source_name)) -> value ret {</span><br><span>          setverdict(fail, "Unexpected UL ERROR Cause");</span><br><span>             mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [exp_fail] GSUP.receive(tr_GSUP_UL_RES(imsi)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+       [exp_fail] GSUP.receive(tr_GSUP_UL_RES(imsi, destination_name := source_name)) -> value ret {</span><br><span>             setverdict(fail, "Unexpected UL.res for unknown IMSI");</span><br><span>            mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [exp_fail] GSUP.receive(tr_GSUP_ISD_REQ(imsi)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+      [exp_fail] GSUP.receive(tr_GSUP_ISD_REQ(imsi, destination_name := source_name)) -> value ret {</span><br><span>            setverdict(fail, "Unexpected ISD.req in error case");</span><br><span>              mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [not exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, ?)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+        [not exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, ?, destination_name := source_name)) -> value ret {</span><br><span>              setverdict(fail, "Unexpected UL ERROR");</span><br><span>           mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [not exp_fail and not isd_done] GSUP.receive(tr_GSUP_ISD_REQ(imsi, msisdn)) -> value ret {</span><br><span style="color: hsl(0, 100%, 40%);">-           GSUP.send(ts_GSUP_ISD_RES(imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_fail and not isd_done] GSUP.receive(tr_GSUP_ISD_REQ(imsi, msisdn, destination_name := source_name)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+                GSUP.send(ts_GSUP_ISD_RES(imsi, source_name := source_name));</span><br><span>                isd_done := true;</span><br><span>            repeat;</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-       [not exp_fail and isd_done] GSUP.receive(tr_GSUP_UL_RES(imsi)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+      [not exp_fail and isd_done] GSUP.receive(tr_GSUP_UL_RES(imsi, destination_name := source_name)) -> value ret {</span><br><span>            setverdict(pass);</span><br><span>            }</span><br><span>    [] GSUP.receive { repeat; }</span><br><span>@@ -612,7 +625,7 @@</span><br><span>    GSUP.receive(tr_GSUP_UL_REQ(imsi)) from vc_GSUP_server;</span><br><span>      GSUP.send(ts_GSUP_ISD_REQ(imsi, msisdn, destination_name)) to vc_GSUP_server;</span><br><span>        GSUP.receive(tr_GSUP_ISD_REQ(imsi, g_pars.sub.msisdn)) from vc_GSUP_client;</span><br><span style="color: hsl(0, 100%, 40%);">-     GSUP.send(ts_GSUP_ISD_RES(imsi, destination_name)) to vc_GSUP_server;</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.send(ts_GSUP_ISD_RES(imsi, destination_name := destination_name)) to vc_GSUP_server;</span><br><span>    GSUP.receive(tr_GSUP_ISD_RES(imsi)) from vc_GSUP_client;</span><br><span>     GSUP.send(ts_GSUP_UL_RES(imsi, destination_name)) to vc_GSUP_server;</span><br><span>         GSUP.receive(tr_GSUP_UL_RES(imsi)) from vc_GSUP_client;</span><br><span>@@ -694,7 +707,8 @@</span><br><span> }</span><br><span> </span><br><span> private function f_SS_expect(hexstring imsi, OCT4 sid, GSUP_SessionState state,</span><br><span style="color: hsl(0, 100%, 40%);">-                            template SS_FacilityInformation facility := *)</span><br><span style="color: hsl(120, 100%, 40%);">+                        template SS_FacilityInformation facility := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                        template octetstring destination_name := omit)</span><br><span> runs on HLR_ConnHdlr return GSUP_PDU {</span><br><span>        var GSUP_PDU ret;</span><br><span>    timer T := 3.0;</span><br><span>@@ -708,7 +722,7 @@</span><br><span>                setverdict(fail, "Unexpected PROC_SS ERROR Cause");</span><br><span>                mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [not exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+      [not exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit, destination_name := destination_name)) -> value ret {</span><br><span>               setverdict(pass);</span><br><span>            }</span><br><span>    [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit)) -> value ret {</span><br><span>@@ -716,12 +730,12 @@</span><br><span>                 mtc.stop;</span><br><span>            }</span><br><span> /*</span><br><span style="color: hsl(0, 100%, 40%);">- [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, decmatch facility)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+     [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, decmatch facility, destination_name := destination_name)) -> value ret {</span><br><span>              setverdict(pass);</span><br><span>            }</span><br><span> */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, ?)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+     [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, ?, destination_name := destination_name)) -> value ret {</span><br><span>              var GSUP_IeValue ss_ie;</span><br><span>              f_gsup_find_ie(ret, OSMO_GSUP_SS_INFO_IE, ss_ie);</span><br><span>            var SS_FacilityInformation dec_fac := dec_SS_FacilityInformation(ss_ie.ss_info);</span><br><span>@@ -748,7 +762,8 @@</span><br><span> </span><br><span> function f_perform_CHECK_IMEI(hexstring imsi, hexstring imei,</span><br><span>                        template (omit) integer exp_err_cause := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-                          template (omit) GSUP_IMEIResult result := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+                       template (omit) GSUP_IMEIResult result := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                       template (omit) octetstring source_name := omit)</span><br><span> runs on HLR_ConnHdlr {</span><br><span>     var GSUP_PDU pdu;</span><br><span>    timer T := 3.0;</span><br><span>@@ -757,28 +772,28 @@</span><br><span>              exp_fail := true;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   GSUP.send(valueof(ts_GSUP_CHECK_IMEI_REQ(imsi, imei)));</span><br><span style="color: hsl(120, 100%, 40%);">+       GSUP.send(valueof(ts_GSUP_CHECK_IMEI_REQ(imsi, imei, source_name := source_name)));</span><br><span>  T.start;</span><br><span>     alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, exp_err_cause)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+        [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, exp_err_cause, destination_name := source_name)) -> value pdu {</span><br><span>              setverdict(pass);</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+    [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?, destination_name := source_name)) -> value pdu {</span><br><span>          setverdict(fail, "Unexpected CHECK IMEI ERROR Cause: ", pdu);</span><br><span>              mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+    [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?, destination_name := source_name)) -> value pdu {</span><br><span>          setverdict(fail, "Unexpected CHECK IMEI RES instead of ERR");</span><br><span>              mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+        [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?, destination_name := source_name)) -> value pdu {</span><br><span>              setverdict(fail, "Unexpected CHECK IMEI ERROR");</span><br><span>           mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, result)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+   [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, result, destination_name := source_name)) -> value pdu {</span><br><span>                 setverdict(pass);</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+        [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?, destination_name := source_name)) -> value pdu {</span><br><span>              setverdict(fail, "Unexpected CHECK IMEI RES");</span><br><span>             mtc.stop;</span><br><span>            }</span><br><span>@@ -827,10 +842,15 @@</span><br><span>    vc_conn.done;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_start_handler_per_sub(void_fn fn, HlrSubscriberList sl) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_start_handler_per_sub(void_fn fn, HlrSubscriberList sl, boolean via_proxy := false) runs on test_CT {</span><br><span>         for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span>              var HlrSubscriber sub := sl[i];</span><br><span style="color: hsl(0, 100%, 40%);">-         var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sub));</span><br><span style="color: hsl(120, 100%, 40%);">+                var HLR_ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (via_proxy) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      pars := valueof(t_Pars_sub_via_proxy(sub));</span><br><span style="color: hsl(120, 100%, 40%);">+           } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      pars := valueof(t_Pars_sub(sub));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>            var HLR_ConnHdlr vc_conn;</span><br><span> </span><br><span>                f_vty_subscr_create(VTY, sub);</span><br><span>@@ -951,8 +971,7 @@</span><br><span> </span><br><span> /* test UL for unknown IMSI */</span><br><span> private function f_TC_ul_unknown_imsi() runs on HLR_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-    var GSUP_PDU res;</span><br><span style="color: hsl(0, 100%, 40%);">-       res := f_perform_UL(g_pars.sub.imsi, ?, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_perform_UL(g_pars.sub.imsi, ?, 2, source_name := g_pars.source_name);</span><br><span>      setverdict(pass);</span><br><span> }</span><br><span> testcase TC_gsup_ul_unknown_imsi() runs on test_CT {</span><br><span>@@ -964,11 +983,20 @@</span><br><span>       vc_conn := f_start_handler(refers(f_TC_ul_unknown_imsi), pars);</span><br><span>      vc_conn.done;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_gsup_ul_unknown_imsi_via_proxy() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var hexstring imsi := f_rnd_imsi('26242'H);</span><br><span style="color: hsl(120, 100%, 40%);">+   var HLR_ConnHdlrPars pars := valueof(t_Pars_via_proxy(imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+ var HLR_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_TC_ul_unknown_imsi), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* test UL for a number of different subscriber cases (algo, 2g/3g, ...) */</span><br><span> private function f_TC_gsup_ul() runs on HLR_ConnHdlr {</span><br><span>        var GSUP_PDU res;</span><br><span style="color: hsl(0, 100%, 40%);">-       res := f_perform_UL(g_pars.sub.imsi, g_pars.sub.msisdn);</span><br><span style="color: hsl(120, 100%, 40%);">+      res := f_perform_UL(g_pars.sub.imsi, g_pars.sub.msisdn, source_name := g_pars.source_name);</span><br><span>  setverdict(pass);</span><br><span> }</span><br><span> testcase TC_gsup_ul() runs on test_CT {</span><br><span>@@ -981,6 +1009,16 @@</span><br><span> </span><br><span>        setverdict(pass);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_gsup_ul_via_proxy() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var HlrSubscriberList sl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var GSUP_PDU res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_start_handler_per_sub(refers(f_TC_gsup_ul), sl, via_proxy := true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* Test only the VTY commands */</span><br><span> testcase TC_vty() runs on test_CT {</span><br><span>@@ -1171,12 +1209,14 @@</span><br><span>                                        op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span>                                       ussd_string := "*#101#");</span><br><span>  GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+                                         OSMO_GSUP_SESSION_STATE_BEGIN, ss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            source_name := g_pars.source_name)));</span><br><span>        resp_str := "Your IMSI is " & hex2str(g_pars.sub.imsi);</span><br><span>        res := f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span>                            OSMO_GSUP_SESSION_STATE_END,</span><br><span>                         tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                             f_encGSM7bit(resp_str)));</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             f_encGSM7bit(resp_str)),</span><br><span style="color: hsl(120, 100%, 40%);">+                    destination_name := g_pars.source_name);</span><br><span> }</span><br><span> testcase TC_mo_ussd_iuse_imsi() runs on test_CT {</span><br><span>        var HlrSubscriberList sl;</span><br><span>@@ -1192,6 +1232,20 @@</span><br><span>           vc_conn.done;</span><br><span>        }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_iuse_imsi_via_proxy() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var HlrSubscriberList sl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var HLR_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub_via_proxy(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+            pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_iuse_imsi), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+             vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* Test for USSD request to internal own-msisdn IUSE. */</span><br><span> private function f_TC_mo_ussd_iuse_msisdn() runs on HLR_ConnHdlr {</span><br><span>@@ -1201,12 +1255,14 @@</span><br><span>                                         op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span>                                       ussd_string := "*#100#");</span><br><span>  GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+                                         OSMO_GSUP_SESSION_STATE_BEGIN, ss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            source_name := g_pars.source_name)));</span><br><span>        resp_str := "Your extension is " & hex2str(g_pars.sub.msisdn);</span><br><span>         res := f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span>                            OSMO_GSUP_SESSION_STATE_END,</span><br><span>                         tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                             f_encGSM7bit(resp_str)));</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             f_encGSM7bit(resp_str)),</span><br><span style="color: hsl(120, 100%, 40%);">+                    destination_name := g_pars.source_name);</span><br><span> }</span><br><span> testcase TC_mo_ussd_iuse_msisdn() runs on test_CT {</span><br><span>      var HlrSubscriberList sl;</span><br><span>@@ -1222,6 +1278,20 @@</span><br><span>           vc_conn.done;</span><br><span>        }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_iuse_msisdn_via_proxy() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var HlrSubscriberList sl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var HLR_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub_via_proxy(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+            pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_iuse_msisdn), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* Test routing of USSD to EUSE by a specific route */</span><br><span> private function f_TC_mo_ussd_100() runs on HLR_ConnHdlr {</span><br><span>@@ -1402,12 +1472,14 @@</span><br><span> private function f_TC_gsup_check_imei() runs on HLR_ConnHdlr {</span><br><span>         /* store-imei disabled */</span><br><span>    f_vty_config(VTY, "hlr", "no store-imei");</span><br><span style="color: hsl(0, 100%, 40%);">-  f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+         source_name := g_pars.source_name);</span><br><span>  f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*IMEI: *12345678901234*");</span><br><span> </span><br><span>         /* store-imei enabled */</span><br><span>     f_vty_config(VTY, "hlr", "store-imei");</span><br><span style="color: hsl(0, 100%, 40%);">-     f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+         source_name := g_pars.source_name);</span><br><span>  f_vty_subscr_show(VTY, g_pars.sub, pattern "*IMEI: *12345678901234*");</span><br><span> }</span><br><span> testcase TC_gsup_check_imei() runs on test_CT {</span><br><span>@@ -1419,6 +1491,15 @@</span><br><span> </span><br><span>        setverdict(pass);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_gsup_check_imei_via_proxy() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var HlrSubscriberList sl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_start_handler_per_sub(refers(f_TC_gsup_check_imei), sl, via_proxy := true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* Test Check IMEI with invalid IMEI length */</span><br><span> private function f_TC_gsup_check_imei_invalid_len() runs on HLR_ConnHdlr {</span><br><span>@@ -1861,8 +1942,10 @@</span><br><span>    execute( TC_gsup_sai_num_auth_vectors() );</span><br><span>   execute( TC_gsup_sai_eps() );</span><br><span>        execute( TC_gsup_ul_unknown_imsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_gsup_ul_unknown_imsi_via_proxy() );</span><br><span>      execute( TC_gsup_sai_err_unknown_imsi() );</span><br><span>   execute( TC_gsup_ul() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_gsup_ul_via_proxy() );</span><br><span>   execute( TC_vty() );</span><br><span>         execute( TC_vty_msisdn_isd() );</span><br><span>      execute( TC_gsup_purge_cs() );</span><br><span>@@ -1872,7 +1955,9 @@</span><br><span>       execute( TC_mo_ussd_unknown() );</span><br><span>     execute( TC_mo_ussd_euse_disc() );</span><br><span>   execute( TC_mo_ussd_iuse_imsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_mo_ussd_iuse_imsi_via_proxy() );</span><br><span>         execute( TC_mo_ussd_iuse_msisdn() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_mo_ussd_iuse_msisdn_via_proxy() );</span><br><span>       execute( TC_mo_ussd_euse() );</span><br><span>        execute( TC_mo_ussd_euse_continue() );</span><br><span>       execute( TC_mo_ussd_euse_defaultroute() );</span><br><span>@@ -1881,6 +1966,7 @@</span><br><span>   execute( TC_mo_sss_reject() );</span><br><span> </span><br><span>   execute( TC_gsup_check_imei() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_gsup_check_imei_via_proxy() );</span><br><span>   execute( TC_gsup_check_imei_invalid_len() );</span><br><span>         execute( TC_gsup_check_imei_unknown_imsi() );</span><br><span>        execute( TC_subscr_create_on_demand_check_imei_early() );</span><br><span>diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn</span><br><span>index fa912c1..41181e8 100644</span><br><span>--- a/library/GSUP_Types.ttcn</span><br><span>+++ b/library/GSUP_Types.ttcn</span><br><span>@@ -495,9 +495,10 @@</span><br><span>    tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {</span><br><span>                      tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS) :=</span><br><span style="color: hsl(0, 100%, 40%);">-        ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {</span><br><span style="color: hsl(0, 100%, 40%);">-                       valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template octetstring source_name := omit) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, f_gen_ts_ies(imsi, dom := dom,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     source_name := source_name));</span><br><span> </span><br><span> template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=</span><br><span>       tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);</span><br><span>@@ -506,30 +507,34 @@</span><br><span>  ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)),</span><br><span>                     valueof(ts_GSUP_IE_Destination_Name(destination_name))});</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi) :=</span><br><span style="color: hsl(0, 100%, 40%);">-       tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi, template octetstring destination_name := omit) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, f_gen_tr_ies(imsi, destination_name := destination_name));</span><br><span> </span><br><span> template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=</span><br><span>  ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {</span><br><span>                      valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?) :=</span><br><span style="color: hsl(0, 100%, 40%);">-       tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {</span><br><span style="color: hsl(0, 100%, 40%);">-                 tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+            template octetstring destination_name := omit) :=</span><br><span style="color: hsl(120, 100%, 40%);">+     tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+         f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));</span><br><span> </span><br><span> template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn, octetstring destination_name := ''O) :=</span><br><span>        ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {</span><br><span>                        valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)),</span><br><span>                  valueof(ts_GSUP_IE_Destination_Name(destination_name))});</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?) :=</span><br><span style="color: hsl(0, 100%, 40%);">-      tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {</span><br><span style="color: hsl(0, 100%, 40%);">-                   tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_MSISDN(msisdn), * });</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                template octetstring destination_name := omit) :=</span><br><span style="color: hsl(120, 100%, 40%);">+     tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+           f_gen_tr_ies(imsi, msisdn := msisdn, destination_name := destination_name));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi, octetstring destination_name := ''O) :=</span><br><span style="color: hsl(0, 100%, 40%);">-       ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {</span><br><span style="color: hsl(0, 100%, 40%);">-                    valueof(ts_GSUP_IE_IMSI(imsi)),</span><br><span style="color: hsl(0, 100%, 40%);">-                 valueof(ts_GSUP_IE_Destination_Name(destination_name))});</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template octetstring source_name := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template octetstring destination_name := omit) :=</span><br><span style="color: hsl(120, 100%, 40%);">+        ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT,</span><br><span style="color: hsl(120, 100%, 40%);">+                f_gen_ts_ies(imsi, source_name := source_name,</span><br><span style="color: hsl(120, 100%, 40%);">+                             destination_name := destination_name));</span><br><span> </span><br><span> template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=</span><br><span>        tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);</span><br><span>@@ -568,9 +573,9 @@</span><br><span>         tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {</span><br><span>             tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring imei) :=</span><br><span style="color: hsl(0, 100%, 40%);">-       ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, {</span><br><span style="color: hsl(0, 100%, 40%);">-                    valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI(imei)) });</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring imei,</span><br><span style="color: hsl(120, 100%, 40%);">+      template (omit) octetstring source_name := omit) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, f_gen_ts_ies(imsi, imei := imei, source_name := source_name));</span><br><span> </span><br><span> template GSUP_PDU tr_GSUP_CHECK_IMEI_REQ(</span><br><span>   template hexstring imsi,</span><br><span>@@ -588,17 +593,18 @@</span><br><span>     ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {</span><br><span>          valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI_Result(result)) });</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template GSUP_IMEIResult result) :=</span><br><span style="color: hsl(0, 100%, 40%);">-    tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {</span><br><span style="color: hsl(0, 100%, 40%);">-             tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_IMEI_Result(result) });</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template GSUP_IMEIResult result,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template octetstring destination_name := omit) :=</span><br><span style="color: hsl(120, 100%, 40%);">+    tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT,</span><br><span style="color: hsl(120, 100%, 40%);">+             f_gen_tr_ies(imsi, imei_result := result, destination_name := destination_name));</span><br><span> </span><br><span> template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_ERR(hexstring imsi, integer cause) :=</span><br><span>  ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {</span><br><span>           valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template integer cause) :=</span><br><span style="color: hsl(0, 100%, 40%);">-    tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {</span><br><span style="color: hsl(0, 100%, 40%);">-              tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template integer cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template octetstring destination_name := omit) :=</span><br><span style="color: hsl(120, 100%, 40%);">+    tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));</span><br><span> </span><br><span> </span><br><span> template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {</span><br><span>@@ -758,7 +764,7 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_IE ts_GSUP_IE_CnDomain(GSUP_CnDomain dom) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_IE ts_GSUP_IE_CnDomain(template GSUP_CnDomain dom) := {</span><br><span>        tag := OSMO_GSUP_CN_DOMAIN_IE,</span><br><span>       len := 0, /* overwritten */</span><br><span>  val := {</span><br><span>@@ -1217,13 +1223,85 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_gen_ts_ies(hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                        template hexstring imei := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                      template GSUP_CnDomain dom := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template octetstring source_name := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                     template octetstring destination_name := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                        ) return GSUP_IEs {</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_IEs ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+         valueof(ts_GSUP_IE_IMSI(imsi))</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%);">+  if (isvalue(dom)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ies := ies & { valueof(ts_GSUP_IE_CnDomain(dom)) };</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%);">+   if (isvalue(imei)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ies := ies & { valueof(ts_GSUP_IE_IMEI(valueof(imei))) };</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%);">+   if (isvalue(source_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };</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%);">+   if (isvalue(destination_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ies := ies & { valueof(ts_GSUP_IE_Destination_Name(valueof(destination_name))) };</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 ies;</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_gen_tr_ies(template hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                            template integer cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                       template hexstring msisdn := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            template GSUP_IMEIResult imei_result := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                         template octetstring source_name := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             template octetstring destination_name := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                        ) return template GSUP_IEs {</span><br><span style="color: hsl(120, 100%, 40%);">+     var template GSUP_IEs ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_GSUP_IE_IMSI(imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer idx := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (isvalue(cause)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ies[idx] := tr_GSUP_IE_Cause(cause);</span><br><span style="color: hsl(120, 100%, 40%);">+          idx := idx + 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%);">+   if (isvalue(msisdn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ies[idx] := tr_GSUP_IE_MSISDN(msisdn);</span><br><span style="color: hsl(120, 100%, 40%);">+                idx := idx + 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%);">+   if (isvalue(imei_result)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ies[idx] := tr_GSUP_IE_IMEI_Result(imei_result);</span><br><span style="color: hsl(120, 100%, 40%);">+              idx := idx + 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%);">+   if (isvalue(source_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ies[idx] := tr_GSUP_IE_Source_Name(source_name);</span><br><span style="color: hsl(120, 100%, 40%);">+              idx := idx + 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%);">+   ies[idx] := *;</span><br><span style="color: hsl(120, 100%, 40%);">+        idx := idx + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (isvalue(destination_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);</span><br><span style="color: hsl(120, 100%, 40%);">+            idx := idx + 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 ies;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> private function f_gen_ts_ss_ies(</span><br><span>      hexstring imsi,</span><br><span>      OCT4 sid,</span><br><span>    GSUP_SessionState state,</span><br><span>     template (omit) octetstring ss := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- template (omit) integer cause := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) integer cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+        template octetstring source_name := omit</span><br><span> ) return GSUP_IEs {</span><br><span>      /* Mandatory IEs */</span><br><span>  var GSUP_IEs ies := {</span><br><span>@@ -1244,6 +1322,10 @@</span><br><span>               ies := ies & { valueof(ts_GSUP_IE_SSInfo(valueof(ss))) };</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (isvalue(source_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return ies;</span><br><span> }</span><br><span> private function f_gen_tr_ss_ies(</span><br><span>@@ -1251,7 +1333,8 @@</span><br><span>        template OCT4 sid := ?,</span><br><span>      template GSUP_SessionState state := ?,</span><br><span>       template octetstring ss := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-        template integer cause := omit</span><br><span style="color: hsl(120, 100%, 40%);">+        template integer cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       template octetstring destination_name := omit</span><br><span> ) return template GSUP_IEs {</span><br><span>        /* Mandatory IEs */</span><br><span>  var template GSUP_IEs ies := {</span><br><span>@@ -1282,6 +1365,11 @@</span><br><span>              idx := idx + 1;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (isvalue(destination_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);</span><br><span style="color: hsl(120, 100%, 40%);">+            idx := idx + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* the GSUP Message Class IE is optional, as old implementations don't have it yet */</span><br><span>    var template GSUP_IEs ies2 := ies;</span><br><span>   ies2[idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);</span><br><span>@@ -1294,10 +1382,11 @@</span><br><span>       hexstring imsi,</span><br><span>      OCT4 sid,</span><br><span>    GSUP_SessionState state,</span><br><span style="color: hsl(0, 100%, 40%);">-        template (omit) octetstring ss := omit</span><br><span style="color: hsl(120, 100%, 40%);">+        template (omit) octetstring ss := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       template (omit) octetstring source_name := omit</span><br><span> ) := ts_GSUP(</span><br><span>     OSMO_GSUP_MSGT_PROC_SS_REQUEST,</span><br><span style="color: hsl(0, 100%, 40%);">- f_gen_ts_ss_ies(imsi, sid, state, ss)</span><br><span style="color: hsl(120, 100%, 40%);">+ f_gen_ts_ss_ies(imsi, sid, state, ss, source_name := source_name)</span><br><span> );</span><br><span> template GSUP_PDU tr_GSUP_PROC_SS_REQ(</span><br><span>    template hexstring imsi,</span><br><span>@@ -1322,10 +1411,11 @@</span><br><span>   template hexstring imsi,</span><br><span>     template OCT4 sid := ?,</span><br><span>      template GSUP_SessionState state := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-  template octetstring ss := *</span><br><span style="color: hsl(120, 100%, 40%);">+  template octetstring ss := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ template octetstring destination_name := omit</span><br><span> ) := tr_GSUP(</span><br><span>       OSMO_GSUP_MSGT_PROC_SS_RESULT,</span><br><span style="color: hsl(0, 100%, 40%);">-  f_gen_tr_ss_ies(imsi, sid, state, ss)</span><br><span style="color: hsl(120, 100%, 40%);">+ f_gen_tr_ss_ies(imsi, sid, state, ss, destination_name := destination_name)</span><br><span> );</span><br><span> </span><br><span> template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/16021">change 16021</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/+/16021"/><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: I3728776d862c5e5fa7628ca28d74c1ef247459fa </div>
<div style="display:none"> Gerrit-Change-Number: 16021 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </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-CC: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>