Change in osmo-ttcn3-hacks[master]: hlr: add tests for GSUP proxy routing

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

neels gerrit-no-reply at lists.osmocom.org
Mon Nov 11 04:50:34 UTC 2019


neels has uploaded this change for review. ( 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.

At the time of writing, these tests still fail on master, and will pass as soon
as GSUP request handling with request->response association is introduced to
osmo-hlr in an upcoming patch (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, 233 insertions(+), 65 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/21/16021/1

diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn
index f8d7483..c3bddab 100644
--- a/hlr/HLR_Tests.ttcn
+++ b/hlr/HLR_Tests.ttcn
@@ -81,26 +81,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 := '7468652d736f757263650a'O); // "the-source"
 
 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 := '7468652d736f757263650a'O // "the-source"
 }
 
 type function void_fn() runs on HLR_ConnHdlr;
@@ -407,7 +419,8 @@
 }
 
 function f_perform_UL(hexstring imsi, template hexstring msisdn,
-			template (omit) integer exp_err_cause := omit)
+			template (omit) integer exp_err_cause := omit,
+			template (omit) octetstring source_name := omit)
 runs on HLR_ConnHdlr return GSUP_PDU {
 	var GSUP_PDU ret;
 	timer T := 3.0;
@@ -417,34 +430,34 @@
 		exp_fail := true;
 	}
 
-	GSUP.send(valueof(ts_GSUP_UL_REQ(imsi)));
+	GSUP.send(valueof(ts_GSUP_UL_REQ(imsi, 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; }
@@ -532,7 +545,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;
@@ -540,13 +554,14 @@
 	if (istemplatekind(facility, "omit")) {
 		exp_ss := false;
 	}
+
 	T.start;
 	alt {
 	[] GSUP.receive(tr_GSUP_PROC_SS_ERR(imsi, sid, ?, ?)) -> value ret {
 		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 {
@@ -559,7 +574,7 @@
 		}
 */
 
-	[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);
@@ -586,7 +601,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;
@@ -595,28 +611,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;
 		}
@@ -665,10 +681,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);
@@ -699,8 +720,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 {
@@ -712,11 +732,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 {
@@ -729,6 +758,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 {
@@ -919,12 +958,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;
@@ -940,6 +981,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 {
@@ -949,12 +1004,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;
@@ -970,6 +1027,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 {
@@ -1150,12 +1221,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 {
@@ -1167,6 +1240,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 {
@@ -1398,8 +1480,10 @@
 	execute( TC_gsup_sai_err_invalid_imsi() );
 	execute( TC_gsup_sai() );
 	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() );
@@ -1409,7 +1493,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() );
@@ -1418,6 +1504,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 74fbfc4..e0535ad 100644
--- a/library/GSUP_Types.ttcn
+++ b/library/GSUP_Types.ttcn
@@ -464,9 +464,8 @@
 	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) :=
-	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
-			valueof(ts_GSUP_IE_IMSI(imsi)) });
+template GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, template octetstring source_name := omit) :=
+	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, f_gen_ts_ies(imsi, source_name := source_name));
 
 template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
 	tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
@@ -474,28 +473,29 @@
 template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
 	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
 
-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) :=
 	ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
 			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
 
-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) :=
-	ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
-			valueof(ts_GSUP_IE_IMSI(imsi)) });
+template GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi, template octetstring source_name := omit) :=
+	ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, f_gen_ts_ies(imsi, source_name := source_name));
 
 template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
 	tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
@@ -534,9 +534,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,
@@ -554,17 +554,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) := {
@@ -1105,12 +1106,80 @@
 	}
 }
 
+private function f_gen_ts_ies(hexstring imsi,
+			   template hexstring imei := 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(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 := {
@@ -1131,6 +1200,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(
@@ -1138,7 +1211,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 := {
@@ -1169,6 +1243,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);
@@ -1181,10 +1260,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,
@@ -1209,10 +1289,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: 1
Gerrit-Owner: neels <nhofmeyr at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20191111/fec1b97f/attachment.htm>


More information about the gerrit-log mailing list