laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/16021 )

Change subject: hlr: add tests for GSUP proxy routing
......................................................................

hlr: add tests for GSUP proxy routing

GSUP proxy routing, as it is implemented in an upcoming osmo-hlr patch,
requires that osmo-hlr returns a received Source Name IE back as Destination
Name IE. Add tests for these, for various situations.

These tests pass since GSUP request handling with request->response association
was introduced to osmo-hlr in I179ebb0385b5b355f4740e14d43be97bf93622e3.

Implement this by adding a source_name to the g_pars, which should be sent out
in ts_GSUP_* to osmo-hlr, and expected back as destination_name in returned
messages.

Add source_name and destination_name to various templates, with default :=
omit.

Add f_gen_ts_ies() and f_gen_tr_ies() to compose expected IEs more generically.

Change-Id: I3728776d862c5e5fa7628ca28d74c1ef247459fa
---
M hlr/HLR_Tests.ttcn
M library/GSUP_Types.ttcn
2 files changed, 245 insertions(+), 69 deletions(-)

Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn
index 0dd3cad..06354b9 100644
--- a/hlr/HLR_Tests.ttcn
+++ b/hlr/HLR_Tests.ttcn
@@ -110,26 +110,38 @@

 type record HLR_ConnHdlrPars {
        HlrSubscriber sub,
-       HLR_ConnHdlrParsUssd ussd optional
+       HLR_ConnHdlrParsUssd ussd optional,
+       octetstring source_name optional
 }

 type record HLR_ConnHdlrParsUssd {
        OCT4 sid
 }

-template (value) HLR_ConnHdlrPars t_Pars(hexstring imsi, hexstring msisdn := 
''H) := {
+template (value) HLR_ConnHdlrPars t_Pars(hexstring imsi, hexstring msisdn := 
''H,
+                                        template (omit) octetstring 
source_name := omit) := {
        sub := {
                imsi := imsi,
                msisdn := msisdn,
                aud2g := omit,
                aud3g := omit
        },
-       ussd := omit
+       ussd := omit,
+       source_name := source_name
 }
+template (value) HLR_ConnHdlrPars t_Pars_via_proxy(hexstring imsi, hexstring 
msisdn := ''H) :=
+       t_Pars(imsi, msisdn, source_name := char2oct("the-source\n"));

 template (value) HLR_ConnHdlrPars t_Pars_sub(HlrSubscriber sub) := {
        sub := sub,
-       ussd := omit
+       ussd := omit,
+       source_name := omit
+}
+
+template (value) HLR_ConnHdlrPars t_Pars_sub_via_proxy(HlrSubscriber sub) := {
+       sub := sub,
+       ussd := omit,
+       source_name := char2oct("the-source\n")
 }

 type function void_fn() runs on HLR_ConnHdlr;
@@ -530,7 +542,8 @@

 function f_perform_UL(hexstring imsi, template hexstring msisdn,
                        template (omit) integer exp_err_cause := omit,
-                       GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS)
+                       GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
+                       template (omit) octetstring source_name := omit)
 runs on HLR_ConnHdlr return GSUP_PDU {
        var GSUP_PDU ret;
        timer T := 3.0;
@@ -540,34 +553,34 @@
                exp_fail := true;
        }

-       GSUP.send(valueof(ts_GSUP_UL_REQ(imsi, dom)));
+       GSUP.send(valueof(ts_GSUP_UL_REQ(imsi, dom, source_name := 
source_name)));
        T.start;
        alt {
-       [exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, exp_err_cause)) -> value 
ret {
+       [exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, exp_err_cause, 
destination_name := source_name)) -> value ret {
                setverdict(pass);
                }
-       [exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, ?)) -> value ret {
+       [exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, ?, destination_name := 
source_name)) -> value ret {
                setverdict(fail, "Unexpected UL ERROR Cause");
                mtc.stop;
                }
-       [exp_fail] GSUP.receive(tr_GSUP_UL_RES(imsi)) -> value ret {
+       [exp_fail] GSUP.receive(tr_GSUP_UL_RES(imsi, destination_name := 
source_name)) -> value ret {
                setverdict(fail, "Unexpected UL.res for unknown IMSI");
                mtc.stop;
                }
-       [exp_fail] GSUP.receive(tr_GSUP_ISD_REQ(imsi)) -> value ret {
+       [exp_fail] GSUP.receive(tr_GSUP_ISD_REQ(imsi, destination_name := 
source_name)) -> value ret {
                setverdict(fail, "Unexpected ISD.req in error case");
                mtc.stop;
                }
-       [not exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, ?)) -> value ret {
+       [not exp_fail] GSUP.receive(tr_GSUP_UL_ERR(imsi, ?, destination_name := 
source_name)) -> value ret {
                setverdict(fail, "Unexpected UL ERROR");
                mtc.stop;
                }
-       [not exp_fail and not isd_done] GSUP.receive(tr_GSUP_ISD_REQ(imsi, 
msisdn)) -> value ret {
-               GSUP.send(ts_GSUP_ISD_RES(imsi));
+       [not exp_fail and not isd_done] GSUP.receive(tr_GSUP_ISD_REQ(imsi, 
msisdn, destination_name := source_name)) -> value ret {
+               GSUP.send(ts_GSUP_ISD_RES(imsi, source_name := source_name));
                isd_done := true;
                repeat;
                }
-       [not exp_fail and isd_done] GSUP.receive(tr_GSUP_UL_RES(imsi)) -> value 
ret {
+       [not exp_fail and isd_done] GSUP.receive(tr_GSUP_UL_RES(imsi, 
destination_name := source_name)) -> value ret {
                setverdict(pass);
                }
        [] GSUP.receive { repeat; }
@@ -612,7 +625,7 @@
        GSUP.receive(tr_GSUP_UL_REQ(imsi)) from vc_GSUP_server;
        GSUP.send(ts_GSUP_ISD_REQ(imsi, msisdn, destination_name)) to 
vc_GSUP_server;
        GSUP.receive(tr_GSUP_ISD_REQ(imsi, g_pars.sub.msisdn)) from 
vc_GSUP_client;
-       GSUP.send(ts_GSUP_ISD_RES(imsi, destination_name)) to vc_GSUP_server;
+       GSUP.send(ts_GSUP_ISD_RES(imsi, destination_name := destination_name)) 
to vc_GSUP_server;
        GSUP.receive(tr_GSUP_ISD_RES(imsi)) from vc_GSUP_client;
        GSUP.send(ts_GSUP_UL_RES(imsi, destination_name)) to vc_GSUP_server;
        GSUP.receive(tr_GSUP_UL_RES(imsi)) from vc_GSUP_client;
@@ -694,7 +707,8 @@
 }

 private function f_SS_expect(hexstring imsi, OCT4 sid, GSUP_SessionState state,
-                            template SS_FacilityInformation facility := *)
+                            template SS_FacilityInformation facility := *,
+                            template octetstring destination_name := omit)
 runs on HLR_ConnHdlr return GSUP_PDU {
        var GSUP_PDU ret;
        timer T := 3.0;
@@ -708,7 +722,7 @@
                setverdict(fail, "Unexpected PROC_SS ERROR Cause");
                mtc.stop;
                }
-       [not exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit)) 
-> value ret {
+       [not exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit, 
destination_name := destination_name)) -> value ret {
                setverdict(pass);
                }
        [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit)) -> 
value ret {
@@ -716,12 +730,12 @@
                mtc.stop;
                }
 /*
-       [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, decmatch 
facility)) -> value ret {
+       [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, decmatch 
facility, destination_name := destination_name)) -> value ret {
                setverdict(pass);
                }
 */

-       [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, ?)) -> 
value ret {
+       [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, ?, 
destination_name := destination_name)) -> value ret {
                var GSUP_IeValue ss_ie;
                f_gsup_find_ie(ret, OSMO_GSUP_SS_INFO_IE, ss_ie);
                var SS_FacilityInformation dec_fac := 
dec_SS_FacilityInformation(ss_ie.ss_info);
@@ -748,7 +762,8 @@

 function f_perform_CHECK_IMEI(hexstring imsi, hexstring imei,
                              template (omit) integer exp_err_cause := omit,
-                             template (omit) GSUP_IMEIResult result := omit)
+                             template (omit) GSUP_IMEIResult result := omit,
+                             template (omit) octetstring source_name := omit)
 runs on HLR_ConnHdlr {
        var GSUP_PDU pdu;
        timer T := 3.0;
@@ -757,28 +772,28 @@
                exp_fail := true;
        }

-       GSUP.send(valueof(ts_GSUP_CHECK_IMEI_REQ(imsi, imei)));
+       GSUP.send(valueof(ts_GSUP_CHECK_IMEI_REQ(imsi, imei, source_name := 
source_name)));
        T.start;
        alt {
-       [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, exp_err_cause)) -> 
value pdu {
+       [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, exp_err_cause, 
destination_name := source_name)) -> value pdu {
                setverdict(pass);
                }
-       [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?)) -> value pdu {
+       [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?, 
destination_name := source_name)) -> value pdu {
                setverdict(fail, "Unexpected CHECK IMEI ERROR Cause: ", pdu);
                mtc.stop;
                }
-       [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?)) -> value pdu {
+       [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?, 
destination_name := source_name)) -> value pdu {
                setverdict(fail, "Unexpected CHECK IMEI RES instead of ERR");
                mtc.stop;
                }
-       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?)) -> value 
pdu {
+       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?, 
destination_name := source_name)) -> value pdu {
                setverdict(fail, "Unexpected CHECK IMEI ERROR");
                mtc.stop;
                }
-       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, result)) -> 
value pdu {
+       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, result, 
destination_name := source_name)) -> value pdu {
                setverdict(pass);
                }
-       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?)) -> value 
pdu {
+       [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?, 
destination_name := source_name)) -> value pdu {
                setverdict(fail, "Unexpected CHECK IMEI RES");
                mtc.stop;
                }
@@ -827,10 +842,15 @@
        vc_conn.done;
 }

-function f_start_handler_per_sub(void_fn fn, HlrSubscriberList sl) runs on 
test_CT {
+function f_start_handler_per_sub(void_fn fn, HlrSubscriberList sl, boolean 
via_proxy := false) runs on test_CT {
        for (var integer i := 0; i < sizeof(sl); i := i+1) {
                var HlrSubscriber sub := sl[i];
-               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sub));
+               var HLR_ConnHdlrPars pars;
+               if (via_proxy) {
+                       pars := valueof(t_Pars_sub_via_proxy(sub));
+               } else {
+                       pars := valueof(t_Pars_sub(sub));
+               }
                var HLR_ConnHdlr vc_conn;

                f_vty_subscr_create(VTY, sub);
@@ -951,8 +971,7 @@

 /* test UL for unknown IMSI */
 private function f_TC_ul_unknown_imsi() runs on HLR_ConnHdlr {
-       var GSUP_PDU res;
-       res := f_perform_UL(g_pars.sub.imsi, ?, 2);
+       f_perform_UL(g_pars.sub.imsi, ?, 2, source_name := g_pars.source_name);
        setverdict(pass);
 }
 testcase TC_gsup_ul_unknown_imsi() runs on test_CT {
@@ -964,11 +983,20 @@
        vc_conn := f_start_handler(refers(f_TC_ul_unknown_imsi), pars);
        vc_conn.done;
 }
+testcase TC_gsup_ul_unknown_imsi_via_proxy() runs on test_CT {
+       var hexstring imsi := f_rnd_imsi('26242'H);
+       var HLR_ConnHdlrPars pars := valueof(t_Pars_via_proxy(imsi));
+       var HLR_ConnHdlr vc_conn;
+
+       f_init(false);
+       vc_conn := f_start_handler(refers(f_TC_ul_unknown_imsi), pars);
+       vc_conn.done;
+}

 /* test UL for a number of different subscriber cases (algo, 2g/3g, ...) */
 private function f_TC_gsup_ul() runs on HLR_ConnHdlr {
        var GSUP_PDU res;
-       res := f_perform_UL(g_pars.sub.imsi, g_pars.sub.msisdn);
+       res := f_perform_UL(g_pars.sub.imsi, g_pars.sub.msisdn, source_name := 
g_pars.source_name);
        setverdict(pass);
 }
 testcase TC_gsup_ul() runs on test_CT {
@@ -981,6 +1009,16 @@

        setverdict(pass);
 }
+testcase TC_gsup_ul_via_proxy() runs on test_CT {
+       var HlrSubscriberList sl;
+       var GSUP_PDU res;
+
+       f_init(false);
+       sl := f_gen_subs();
+       f_start_handler_per_sub(refers(f_TC_gsup_ul), sl, via_proxy := true);
+
+       setverdict(pass);
+}

 /* Test only the VTY commands */
 testcase TC_vty() runs on test_CT {
@@ -1171,12 +1209,14 @@
                                        op_code := SS_OP_CODE_PROCESS_USS_REQ,
                                        ussd_string := "*#101#");
        GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
-                                               OSMO_GSUP_SESSION_STATE_BEGIN, 
ss)));
+                                               OSMO_GSUP_SESSION_STATE_BEGIN, 
ss,
+                                               source_name := 
g_pars.source_name)));
        resp_str := "Your IMSI is " & hex2str(g_pars.sub.imsi);
        res := f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid,
                           OSMO_GSUP_SESSION_STATE_END,
                           tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, 
SS_USSD_DEFAULT_DCS,
-                                                            
f_encGSM7bit(resp_str)));
+                                                            
f_encGSM7bit(resp_str)),
+                          destination_name := g_pars.source_name);
 }
 testcase TC_mo_ussd_iuse_imsi() runs on test_CT {
        var HlrSubscriberList sl;
@@ -1192,6 +1232,20 @@
                vc_conn.done;
        }
 }
+testcase TC_mo_ussd_iuse_imsi_via_proxy() runs on test_CT {
+       var HlrSubscriberList sl;
+       var HLR_ConnHdlr vc_conn;
+
+       f_init(false);
+       sl := f_gen_subs();
+       for (var integer i := 0; i < sizeof(sl); i := i+1) {
+               var HLR_ConnHdlrPars pars := 
valueof(t_Pars_sub_via_proxy(sl[i]));
+               pars.ussd.sid := f_rnd_octstring(4);
+               f_vty_subscr_create(VTY, pars.sub);
+               vc_conn := f_start_handler(refers(f_TC_mo_ussd_iuse_imsi), 
pars);
+               vc_conn.done;
+       }
+}

 /* Test for USSD request to internal own-msisdn IUSE. */
 private function f_TC_mo_ussd_iuse_msisdn() runs on HLR_ConnHdlr {
@@ -1201,12 +1255,14 @@
                                        op_code := SS_OP_CODE_PROCESS_USS_REQ,
                                        ussd_string := "*#100#");
        GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
-                                               OSMO_GSUP_SESSION_STATE_BEGIN, 
ss)));
+                                               OSMO_GSUP_SESSION_STATE_BEGIN, 
ss,
+                                               source_name := 
g_pars.source_name)));
        resp_str := "Your extension is " & hex2str(g_pars.sub.msisdn);
        res := f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid,
                           OSMO_GSUP_SESSION_STATE_END,
                           tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, 
SS_USSD_DEFAULT_DCS,
-                                                            
f_encGSM7bit(resp_str)));
+                                                            
f_encGSM7bit(resp_str)),
+                          destination_name := g_pars.source_name);
 }
 testcase TC_mo_ussd_iuse_msisdn() runs on test_CT {
        var HlrSubscriberList sl;
@@ -1222,6 +1278,20 @@
                vc_conn.done;
        }
 }
+testcase TC_mo_ussd_iuse_msisdn_via_proxy() runs on test_CT {
+       var HlrSubscriberList sl;
+       var HLR_ConnHdlr vc_conn;
+
+       f_init(false);
+       sl := f_gen_subs();
+       for (var integer i := 0; i < sizeof(sl); i := i+1) {
+               var HLR_ConnHdlrPars pars := 
valueof(t_Pars_sub_via_proxy(sl[i]));
+               pars.ussd.sid := f_rnd_octstring(4);
+               f_vty_subscr_create(VTY, pars.sub);
+               vc_conn := f_start_handler(refers(f_TC_mo_ussd_iuse_msisdn), 
pars);
+               vc_conn.done;
+       }
+}

 /* Test routing of USSD to EUSE by a specific route */
 private function f_TC_mo_ussd_100() runs on HLR_ConnHdlr {
@@ -1402,12 +1472,14 @@
 private function f_TC_gsup_check_imei() runs on HLR_ConnHdlr {
        /* store-imei disabled */
        f_vty_config(VTY, "hlr", "no store-imei");
-       f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := 
OSMO_GSUP_IMEI_RESULT_ACK);
+       f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := 
OSMO_GSUP_IMEI_RESULT_ACK,
+               source_name := g_pars.source_name);
        f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*IMEI: 
*12345678901234*");

        /* store-imei enabled */
        f_vty_config(VTY, "hlr", "store-imei");
-       f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := 
OSMO_GSUP_IMEI_RESULT_ACK);
+       f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := 
OSMO_GSUP_IMEI_RESULT_ACK,
+               source_name := g_pars.source_name);
        f_vty_subscr_show(VTY, g_pars.sub, pattern "*IMEI: *12345678901234*");
 }
 testcase TC_gsup_check_imei() runs on test_CT {
@@ -1419,6 +1491,15 @@

        setverdict(pass);
 }
+testcase TC_gsup_check_imei_via_proxy() runs on test_CT {
+       var HlrSubscriberList sl;
+
+       f_init(false);
+       sl := f_gen_subs();
+       f_start_handler_per_sub(refers(f_TC_gsup_check_imei), sl, via_proxy := 
true);
+
+       setverdict(pass);
+}

 /* Test Check IMEI with invalid IMEI length */
 private function f_TC_gsup_check_imei_invalid_len() runs on HLR_ConnHdlr {
@@ -1861,8 +1942,10 @@
        execute( TC_gsup_sai_num_auth_vectors() );
        execute( TC_gsup_sai_eps() );
        execute( TC_gsup_ul_unknown_imsi() );
+       execute( TC_gsup_ul_unknown_imsi_via_proxy() );
        execute( TC_gsup_sai_err_unknown_imsi() );
        execute( TC_gsup_ul() );
+       execute( TC_gsup_ul_via_proxy() );
        execute( TC_vty() );
        execute( TC_vty_msisdn_isd() );
        execute( TC_gsup_purge_cs() );
@@ -1872,7 +1955,9 @@
        execute( TC_mo_ussd_unknown() );
        execute( TC_mo_ussd_euse_disc() );
        execute( TC_mo_ussd_iuse_imsi() );
+       execute( TC_mo_ussd_iuse_imsi_via_proxy() );
        execute( TC_mo_ussd_iuse_msisdn() );
+       execute( TC_mo_ussd_iuse_msisdn_via_proxy() );
        execute( TC_mo_ussd_euse() );
        execute( TC_mo_ussd_euse_continue() );
        execute( TC_mo_ussd_euse_defaultroute() );
@@ -1881,6 +1966,7 @@
        execute( TC_mo_sss_reject() );

        execute( TC_gsup_check_imei() );
+       execute( TC_gsup_check_imei_via_proxy() );
        execute( TC_gsup_check_imei_invalid_len() );
        execute( TC_gsup_check_imei_unknown_imsi() );
        execute( TC_subscr_create_on_demand_check_imei_early() );
diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn
index fa912c1..41181e8 100644
--- a/library/GSUP_Types.ttcn
+++ b/library/GSUP_Types.ttcn
@@ -495,9 +495,10 @@
        tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
                        tr_GSUP_IE_IMSI(imsi), *, 
tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });

-template (value) GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, GSUP_CnDomain dom := 
OSMO_GSUP_CN_DOMAIN_PS) :=
-       ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
-                       valueof(ts_GSUP_IE_IMSI(imsi)), 
valueof(ts_GSUP_IE_CnDomain(dom)) });
+template GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, GSUP_CnDomain dom := 
OSMO_GSUP_CN_DOMAIN_PS,
+                                        template octetstring source_name := 
omit) :=
+       ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, f_gen_ts_ies(imsi, dom 
:= dom,
+                                                                    
source_name := source_name));

 template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
        tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
@@ -506,30 +507,34 @@
        ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { 
valueof(ts_GSUP_IE_IMSI(imsi)),
                        
valueof(ts_GSUP_IE_Destination_Name(destination_name))});

-template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi) :=
-       tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, imsi);
+template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi, template octetstring 
destination_name := omit) :=
+       tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, f_gen_tr_ies(imsi, 
destination_name := destination_name));

 template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
        ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
                        valueof(ts_GSUP_IE_IMSI(imsi)), 
valueof(ts_GSUP_IE_Cause(cause)) });

-template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer 
cause := ?) :=
-       tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
-                       tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
+template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer 
cause := ?,
+               template octetstring destination_name := omit) :=
+       tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR,
+               f_gen_tr_ies(imsi, cause := cause, destination_name := 
destination_name));

 template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn, 
octetstring destination_name := ''O) :=
        ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
                        valueof(ts_GSUP_IE_IMSI(imsi)), 
valueof(ts_GSUP_IE_MSISDN(msisdn)),
                        
valueof(ts_GSUP_IE_Destination_Name(destination_name))});

-template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring 
msisdn := ?) :=
-       tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
-                       tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_MSISDN(msisdn), * 
});
+template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring 
msisdn := ?,
+               template octetstring destination_name := omit) :=
+       tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST,
+               f_gen_tr_ies(imsi, msisdn := msisdn, destination_name := 
destination_name));

-template (value) GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi, octetstring 
destination_name := ''O) :=
-       ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
-                       valueof(ts_GSUP_IE_IMSI(imsi)),
-                       
valueof(ts_GSUP_IE_Destination_Name(destination_name))});
+template GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi,
+                                  template octetstring source_name := omit,
+                                  template octetstring destination_name := 
omit) :=
+       ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT,
+                f_gen_ts_ies(imsi, source_name := source_name,
+                             destination_name := destination_name));

 template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
        tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
@@ -568,9 +573,9 @@
        tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
                tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });

-template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring 
imei) :=
-       ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, {
-                       valueof(ts_GSUP_IE_IMSI(imsi)), 
valueof(ts_GSUP_IE_IMEI(imei)) });
+template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring 
imei,
+      template (omit) octetstring source_name := omit) :=
+       ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, f_gen_ts_ies(imsi, imei := 
imei, source_name := source_name));

 template GSUP_PDU tr_GSUP_CHECK_IMEI_REQ(
        template hexstring imsi,
@@ -588,17 +593,18 @@
        ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {
                valueof(ts_GSUP_IE_IMSI(imsi)), 
valueof(ts_GSUP_IE_IMEI_Result(result)) });

-template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template 
GSUP_IMEIResult result) :=
-       tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {
-               tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_IMEI_Result(result) });
+template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template 
GSUP_IMEIResult result,
+                                        template octetstring destination_name 
:= omit) :=
+       tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT,
+               f_gen_tr_ies(imsi, imei_result := result, destination_name := 
destination_name));

 template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_ERR(hexstring imsi, integer 
cause) :=
        ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {
                valueof(ts_GSUP_IE_IMSI(imsi)), 
valueof(ts_GSUP_IE_Cause(cause)) });

-template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template 
integer cause) :=
-       tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {
-               tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
+template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template 
integer cause,
+                                        template octetstring destination_name 
:= omit) :=
+       tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, f_gen_tr_ies(imsi, cause := 
cause, destination_name := destination_name));


 template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
@@ -758,7 +764,7 @@
        }
 }

-template (value) GSUP_IE ts_GSUP_IE_CnDomain(GSUP_CnDomain dom) := {
+template GSUP_IE ts_GSUP_IE_CnDomain(template GSUP_CnDomain dom) := {
        tag := OSMO_GSUP_CN_DOMAIN_IE,
        len := 0, /* overwritten */
        val := {
@@ -1217,13 +1223,85 @@
        }
 }

+private function f_gen_ts_ies(hexstring imsi,
+                          template hexstring imei := omit,
+                          template GSUP_CnDomain dom := omit,
+                          template octetstring source_name := omit,
+                          template octetstring destination_name := omit
+                         ) return GSUP_IEs {
+       var GSUP_IEs ies := {
+               valueof(ts_GSUP_IE_IMSI(imsi))
+       };
+
+       if (isvalue(dom)) {
+               ies := ies & { valueof(ts_GSUP_IE_CnDomain(dom)) };
+       }
+
+       if (isvalue(imei)) {
+               ies := ies & { valueof(ts_GSUP_IE_IMEI(valueof(imei))) };
+       }
+
+       if (isvalue(source_name)) {
+               ies := ies & { 
valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
+       }
+
+       if (isvalue(destination_name)) {
+               ies := ies & { 
valueof(ts_GSUP_IE_Destination_Name(valueof(destination_name))) };
+       }
+
+       return ies;
+}
+
+private function f_gen_tr_ies(template hexstring imsi,
+                             template integer cause := omit,
+                             template hexstring msisdn := omit,
+                             template GSUP_IMEIResult imei_result := omit,
+                             template octetstring source_name := omit,
+                             template octetstring destination_name := omit
+                            ) return template GSUP_IEs {
+       var template GSUP_IEs ies := {
+               tr_GSUP_IE_IMSI(imsi)
+       };
+       var integer idx := 1;
+
+       if (isvalue(cause)) {
+               ies[idx] := tr_GSUP_IE_Cause(cause);
+               idx := idx + 1;
+       }
+
+       if (isvalue(msisdn)) {
+               ies[idx] := tr_GSUP_IE_MSISDN(msisdn);
+               idx := idx + 1;
+       }
+
+       if (isvalue(imei_result)) {
+               ies[idx] := tr_GSUP_IE_IMEI_Result(imei_result);
+               idx := idx + 1;
+       }
+
+       if (isvalue(source_name)) {
+               ies[idx] := tr_GSUP_IE_Source_Name(source_name);
+               idx := idx + 1;
+       }
+
+       ies[idx] := *;
+       idx := idx + 1;
+
+       if (isvalue(destination_name)) {
+               ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
+               idx := idx + 1;
+       }
+
+       return ies;
+}

 private function f_gen_ts_ss_ies(
        hexstring imsi,
        OCT4 sid,
        GSUP_SessionState state,
        template (omit) octetstring ss := omit,
-       template (omit) integer cause := omit
+       template (omit) integer cause := omit,
+       template octetstring source_name := omit
 ) return GSUP_IEs {
        /* Mandatory IEs */
        var GSUP_IEs ies := {
@@ -1244,6 +1322,10 @@
                ies := ies & { valueof(ts_GSUP_IE_SSInfo(valueof(ss))) };
        }

+       if (isvalue(source_name)) {
+               ies := ies & { 
valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
+       }
+
        return ies;
 }
 private function f_gen_tr_ss_ies(
@@ -1251,7 +1333,8 @@
        template OCT4 sid := ?,
        template GSUP_SessionState state := ?,
        template octetstring ss := omit,
-       template integer cause := omit
+       template integer cause := omit,
+       template octetstring destination_name := omit
 ) return template GSUP_IEs {
        /* Mandatory IEs */
        var template GSUP_IEs ies := {
@@ -1282,6 +1365,11 @@
                idx := idx + 1;
        }

+       if (isvalue(destination_name)) {
+               ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
+               idx := idx + 1;
+       }
+
        /* the GSUP Message Class IE is optional, as old implementations don't 
have it yet */
        var template GSUP_IEs ies2 := ies;
        ies2[idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);
@@ -1294,10 +1382,11 @@
        hexstring imsi,
        OCT4 sid,
        GSUP_SessionState state,
-       template (omit) octetstring ss := omit
+       template (omit) octetstring ss := omit,
+       template (omit) octetstring source_name := omit
 ) := ts_GSUP(
        OSMO_GSUP_MSGT_PROC_SS_REQUEST,
-       f_gen_ts_ss_ies(imsi, sid, state, ss)
+       f_gen_ts_ss_ies(imsi, sid, state, ss, source_name := source_name)
 );
 template GSUP_PDU tr_GSUP_PROC_SS_REQ(
        template hexstring imsi,
@@ -1322,10 +1411,11 @@
        template hexstring imsi,
        template OCT4 sid := ?,
        template GSUP_SessionState state := ?,
-       template octetstring ss := *
+       template octetstring ss := *,
+       template octetstring destination_name := omit
 ) := tr_GSUP(
        OSMO_GSUP_MSGT_PROC_SS_RESULT,
-       f_gen_tr_ss_ies(imsi, sid, state, ss)
+       f_gen_tr_ss_ies(imsi, sid, state, ss, destination_name := 
destination_name)
 );

 template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(

--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/16021
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I3728776d862c5e5fa7628ca28d74c1ef247459fa
Gerrit-Change-Number: 16021
Gerrit-PatchSet: 7
Gerrit-Owner: neels <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: neels <[email protected]>
Gerrit-CC: fixeria <[email protected]>
Gerrit-CC: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to