<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>