Harald Welte has uploaded this change for review. ( 
https://gerrit.osmocom.org/13753


Change subject: msc: Add Iu related tests for most existing 2G tests
......................................................................

msc: Add Iu related tests for most existing 2G tests

This might look a bit like copy+paste programming for our testcases.

However, we actually want the Iu related tests show up as separate
'testscase' in the TTCN-3 sense, so there's no way that's more elegant
than this :/

Change-Id: I3b56e17487c9df839e67ed390a1ff89979683e8e
---
M msc/BSC_ConnectionHandler.ttcn
M msc/MSC_Tests.ttcn
2 files changed, 476 insertions(+), 18 deletions(-)



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

diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn
index 1fd02aa..b1a0491 100644
--- a/msc/BSC_ConnectionHandler.ttcn
+++ b/msc/BSC_ConnectionHandler.ttcn
@@ -86,7 +86,7 @@
        boolean ran_is_geran
 };

-private function imsi_hex2oct(hexstring imsi) return octetstring {
+function imsi_hex2oct(hexstring imsi) return octetstring {
        var hexstring tmp := ''H;
        var octetstring ret;
        var integer i;
diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn
index af654a3..ea6a75e 100644
--- a/msc/MSC_Tests.ttcn
+++ b/msc/MSC_Tests.ttcn
@@ -41,6 +41,7 @@
 import from BSSMAP_Templates all;
 import from RAN_Emulation all;
 import from BSC_ConnectionHandler all;
+import from RANAP_Templates all;

 import from SGsAP_Templates all;
 import from SGsAP_Types all;
@@ -518,6 +519,10 @@
                use_umts_aka := false,
                ran_is_geran := ran_is_geran
        };
+       if (not ran_is_geran) {
+               pars.use_umts_aka := true;
+               pars.net.expect_auth := true;
+       }
        return pars;
 }

@@ -612,6 +617,14 @@
        vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), 3);
        vc_conn.done;
 }
+testcase TC_iu_lu_imsi_reject() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), 1003, ran_idx 
:= 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Do LU by IMSI, timeout on GSUP */
 private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
@@ -640,6 +653,14 @@
        vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), 4);
        vc_conn.done;
 }
+testcase TC_iu_lu_imsi_timeout_gsup() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), 1004, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 private function f_tc_lu_imsi_auth_tmsi(charstring id, BSC_ConnHdlrPars pars) 
runs on BSC_ConnHdlr {
        pars.net.expect_auth := true;
@@ -655,6 +676,7 @@
        vc_conn.done;
 }

+
 private function f_tc_lu_imsi_auth3g_tmsi(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
        pars.net.expect_auth := true;
        pars.use_umts_aka := true;
@@ -669,6 +691,15 @@
        vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth3g_tmsi), 1005);
        vc_conn.done;
 }
+testcase TC_iu_lu_imsi_auth3g_tmsi() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       f_vty_config(MSCVTY, "network", "authentication required");
+
+       vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth3g_tmsi), 1005, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Send CM SERVICE REQ for IMSI that has never performed LU before */
 private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
@@ -711,6 +742,13 @@
        vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), 6);
        vc_conn.done;
 }
+testcase TC_iu_cmserv_imsi_unknown() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), 1006, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) 
runs on BSC_ConnHdlr {
        f_init_handler(pars);
@@ -730,6 +768,14 @@
        vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), 7);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mo_call() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), 1007, ran_idx 
:= 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test LU (with authentication enabled), where HLR times out sending SAI 
response */
 private function f_tc_lu_auth_sai_timeout(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
@@ -745,7 +791,9 @@
        f_cl3_or_initial_ue(l3_lu);
 
        /* Send Early Classmark, just for the fun of it */
-       BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       if (pars.ran_is_geran) {
+               BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       }
 
        GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
        /* The HLR would normally return an auth vector here, but we fail to do 
so. */
@@ -761,6 +809,15 @@
        vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), 8);
        vc_conn.done;
 }
+testcase TC_iu_lu_auth_sai_timeout() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       f_vty_config(MSCVTY, "network", "authentication required");
+
+       vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), 1008, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test LU (with authentication enabled), where HLR rejects sending SAI error 
*/
 private function f_tc_lu_auth_sai_err(charstring id, BSC_ConnHdlrPars pars) 
runs on BSC_ConnHdlr {
@@ -776,7 +833,9 @@
        f_cl3_or_initial_ue(l3_lu);

        /* Send Early Classmark, just for the fun of it */
-       BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       if (pars.ran_is_geran) {
+               BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       }

        GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
        GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 13));
@@ -792,6 +851,15 @@
        vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), 9);
        vc_conn.done;
 }
+testcase TC_iu_lu_auth_sai_err() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       f_vty_config(MSCVTY, "network", "authentication required");
+
+       vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), 1009, ran_idx 
:= 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test LU but BSC will send a clear request in the middle */
 private function f_tc_lu_clear_request(charstring id, BSC_ConnHdlrPars pars) 
runs on BSC_ConnHdlr {
@@ -836,6 +904,47 @@
        vc_conn.done;
 }

+/* Test LU but RNC will send a Iu Release request in the middle */
+private function f_tc_iu_lu_release_request(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
+       f_init_handler(pars);
+
+       var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
+       var PDU_DTAP_MT dtap_mt;
+
+       /* tell GSUP dispatcher to send this IMSI to us */
+       f_create_gsup_expect(hex2str(g_pars.imsi));
+
+       /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+       f_cl3_or_initial_ue(l3_lu);
+
+       f_sleep(1.0);
+       /* send release request in the middle of the LU */
+       BSSAP.send(ts_RANAP_IuReleaseRequest(ts_RanapCause_om_intervention));
+       alt {
+       [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { repeat; }
+       [] BSSAP.receive(tr_RANAP_IuReleaseCommand(?)) {}
+       }
+       BSSAP.send(ts_RANAP_IuReleaseComplete);
+       alt {
+       /* See https://osmocom.org/issues/2862 */
+       [] BSSAP.receive(tr_RANAP_IuReleaseCommand(?)) {
+                       setverdict(fail, "Got a second Iu Release Command, only 
one expected");
+                       mtc.stop;
+                       repeat;
+               }
+       [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
+       }
+       setverdict(pass);
+}
+testcase TC_iu_lu_release_request() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_iu_lu_release_request), 1010, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+
+
 /* Test LU but BSC will send a clear request in the middle */
 private function f_tc_lu_disconnect(charstring id, BSC_ConnHdlrPars pars) runs 
on BSC_ConnHdlr {
        f_init_handler(pars);
@@ -850,7 +959,9 @@
        f_cl3_or_initial_ue(l3_lu);

        /* Send Early Classmark, just for the fun of it */
-       BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       if (pars.ran_is_geran) {
+               BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       }

        f_sleep(1.0);
        /* send clear request in the middle of the LU */
@@ -865,6 +976,13 @@
        vc_conn := f_start_handler(refers(f_tc_lu_disconnect), 11);
        vc_conn.done;
 }
+testcase TC_iu_lu_disconnect() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_lu_disconnect), 1011, ran_idx := 
2, ran_is_geran := false);
+       vc_conn.done;
+}


 /* Test LU but with illegal mobile identity type = IMEI */
@@ -881,7 +999,9 @@
        f_cl3_or_initial_ue(l3_lu);

        /* Send Early Classmark, just for the fun of it */
-       BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       if (pars.ran_is_geran) {
+               BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       }
        /* wait for LU reject, ignore any ID REQ */
        alt {
        [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
@@ -897,6 +1017,14 @@
        vc_conn := f_start_handler(refers(f_tc_lu_by_imei), 12);
        vc_conn.done;
 }
+testcase TC_iu_lu_by_imei() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_lu_by_imei), 1012, ran_idx := 2, 
ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test LU by TMSI with unknown TMSI, expect (and answer) ID REQ. */
 private function f_tc_lu_tmsi_noauth_unknown(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
@@ -962,7 +1090,9 @@
        f_cl3_or_initial_ue(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));

        /* Send Early Classmark, just for the fun of it? */
-       BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       if (pars.ran_is_geran) {
+               BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       }

        /* wait for normal teardown */
        f_expect_clear();
@@ -974,6 +1104,14 @@
        vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), 14);
        vc_conn.done;
 }
+testcase TC_iu_imsi_detach_by_imsi() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), 1014, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test IMSI DETACH (MI=TMSI) */
 private function f_tc_imsi_detach_by_tmsi(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
@@ -985,7 +1123,9 @@
        f_cl3_or_initial_ue(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));

        /* Send Early Classmark, just for the fun of it? */
-       BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       if (pars.ran_is_geran) {
+               BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       }

        /* wait for normal teardown */
        f_expect_clear();
@@ -997,6 +1137,14 @@
        vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), 15);
        vc_conn.done;
 }
+testcase TC_iu_imsi_detach_by_tmsi() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), 1015, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test IMSI DETACH (MI=IMEI), which is illegal */
 private function f_tc_imsi_detach_by_imei(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
@@ -1008,7 +1156,9 @@
        f_cl3_or_initial_ue(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));

        /* Send Early Classmark, just for the fun of it? */
-       BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       if (pars.ran_is_geran) {
+               BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+       }

        /* wait for normal teardown */
        f_expect_clear();
@@ -1020,6 +1170,13 @@
        vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), 16);
        vc_conn.done;
 }
+testcase TC_iu_imsi_detach_by_imei() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), 1016, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}


 /* helper function for an emergency call. caller passes in mobile identity to 
use */
@@ -1048,6 +1205,14 @@
        vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), 17);
        vc_conn.done;
 }
+testcase TC_iu_emerg_call_imei_reject() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), 1017, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* establish an emergency call by IMSI, SIM inserted (and hence IMSI) */
 private function f_tc_emerg_call_imsi(charstring id, BSC_ConnHdlrPars pars) 
runs on BSC_ConnHdlr {
@@ -1064,6 +1229,14 @@
        vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), 18);
        vc_conn.done;
 }
+testcase TC_iu_emerg_call_imsi() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), 1018, ran_idx 
:= 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* CM Service Request for VGCS -> reject */
 private function f_tc_cm_serv_req_vgcs_reject(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
@@ -1291,6 +1464,14 @@
        vc_conn := f_start_handler(refers(f_tc_establish_and_nothing), 27);
        vc_conn.done;
 }
+testcase TC_iu_establish_and_nothing() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_establish_and_nothing), 1027, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test MO Call SETUP with no response from MNCC */
 private function f_tc_mo_setup_and_nothing(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
@@ -1321,6 +1502,14 @@
        vc_conn := f_start_handler(refers(f_tc_mo_setup_and_nothing), 28);
        vc_conn.done;
 }
+testcase TC_iu_mo_setup_and_nothing() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_mo_setup_and_nothing), 1028, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test MO Call with no response to RAN-side CRCX */
 private function f_tc_mo_crcx_ran_timeout(charstring id, BSC_ConnHdlrPars 
pars) runs on BSC_ConnHdlr {
@@ -1360,6 +1549,14 @@
        vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_timeout), 29);
        vc_conn.done;
 }
+testcase TC_iu_mo_crcx_ran_timeout() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_timeout), 1029, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Test MO Call with reject to RAN-side CRCX */
 private function f_tc_mo_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) 
runs on BSC_ConnHdlr {
@@ -1441,6 +1638,13 @@
        vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_reject), 30);
        vc_conn.done;
 }
+testcase TC_iu_mo_crcx_ran_reject() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_reject), 1030, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}


 /* helper function to start a MT call: MNCC SETUP; Paging; DChan est.; DTAP 
SETUP */
@@ -1542,6 +1746,14 @@
        vc_conn := f_start_handler(refers(f_tc_mt_crcx_ran_reject), 31);
        vc_conn.done;
 }
+testcase TC_iu_mt_crcx_ran_reject() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_mt_crcx_ran_reject), 1031, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+


 /* Test MT Call T310 timer */
@@ -1595,6 +1807,14 @@
        vc_conn := f_start_handler(refers(f_tc_mt_t310), 32);
        vc_conn.done;
 }
+testcase TC_iu_mt_t310() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_mt_t310), 1032, ran_idx := 2, 
ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* Perform successful LU + MO call, then GSUP LocationCancel. Subscriber must 
be denied CM SERV */
 private function f_tc_gsup_cancel(charstring id, BSC_ConnHdlrPars pars) runs 
on BSC_ConnHdlr {
@@ -1643,6 +1863,14 @@
        vc_conn := f_start_handler(refers(f_tc_gsup_cancel), 33);
        vc_conn.done;
 }
+testcase TC_iu_gsup_cancel() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_gsup_cancel), 1033, ran_idx := 
2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* A5/1 only permitted on network side, and MS capable to do it */
 private function f_tc_lu_imsi_auth_tmsi_encr_1_13(charstring id, 
BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
@@ -1934,6 +2162,13 @@
        vc_conn := f_start_handler(refers(f_tc_mo_release_timeout), 40);
        vc_conn.done;
 }
+testcase TC_iu_mo_release_timeout() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_mo_release_timeout), 1040, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}


 /* LU followed by MT call (including paging) */
@@ -1983,6 +2218,14 @@
        setverdict(pass);
 }

+/* Two BSSMAP resets from two different BSCs plus one IuCS RANAP Reset */
+testcase TC_reset_two_1iu() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       f_sleep(2.0);
+       setverdict(pass);
+}
+
 /***********************************************************************
  * SMS Testing
  ***********************************************************************/
@@ -2009,6 +2252,13 @@
        vc_conn := f_start_handler(refers(f_tc_lu_and_mo_sms), 42);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mo_sms() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       vc_conn := f_start_handler(refers(f_tc_lu_and_mo_sms), 1042, ran_idx := 
2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 private function f_vty_sms_send(charstring imsi, charstring msisdn, charstring 
text)
 runs on BSC_ConnHdlr {
@@ -2061,6 +2311,15 @@
        vc_conn := f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms), pars);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mt_sms() runs on MTC_CT {
+       var BSC_ConnHdlrPars pars;
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       pars := f_init_pars(1043, ran_idx := 2, ran_is_geran := false);
+       vc_conn := f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms), pars);
+       vc_conn.done;
+}
+

 /* Paging for MT SMS but no response */
 private function f_tc_lu_and_mt_sms_paging_and_nothing(charstring id, 
BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
@@ -2082,18 +2341,22 @@
        f_vty_sms_send(hex2str(pars.imsi), "2342", "Hello SMS");

        /* Expect the MSC to page exactly once */
-       BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi)) { };
+       f_expect_paging();

        /* Wait some time to make sure the MSC is not delivering any further
         * paging messages or anything else that could be unexpected. */
        timer T := 20.0;
        T.start
        alt {
-               [] BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi))
+               [pars.ran_is_geran] BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi))
                {
                        setverdict(fail, "paging seems not to stop!");
                        mtc.stop;
                }
+               [not pars.ran_is_geran] 
BSSAP.receive(tr_RANAP_Paging(cs_domain, imsi_hex2oct(g_pars.imsi), ?)) {
+                       setverdict(fail, "paging seems not to stop!");
+                       mtc.stop;
+               }
                [] BSSAP.receive {
                        setverdict(fail, "unexpected BSSAP message received");
                        self.stop;
@@ -2115,6 +2378,15 @@
        vc_conn := 
f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms_paging_and_nothing), pars);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mt_sms_paging_and_nothing() runs on MTC_CT {
+       var BSC_ConnHdlrPars pars;
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       pars := f_init_pars(101843, ran_idx := 2, ran_is_geran := false);
+       vc_conn := 
f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms_paging_and_nothing), pars);
+       vc_conn.done;
+}
+

 /* mobile originated SMS from MS/BTS/BSC side to SMPP */
 private function f_tc_smpp_mo_sms(charstring id, BSC_ConnHdlrPars pars) runs 
on BSC_ConnHdlr {
@@ -2174,6 +2446,15 @@
        vc_conn.done;
        f_vty_config2(MSCVTY, { "smpp", "esme msc_tester"}, "no default-route");
 }
+testcase TC_iu_smpp_mo_sms() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       f_vty_config2(MSCVTY, { "smpp", "esme msc_tester"}, "default-route");
+       vc_conn := f_start_handler(refers(f_tc_smpp_mo_sms), 1044, ran_idx := 
2, ran_is_geran := false);
+       vc_conn.done;
+       f_vty_config2(MSCVTY, { "smpp", "esme msc_tester"}, "no default-route");
+}
+

 /* Test MO-SMS from MS/BTS/BSC towards HLR (via GSUP) */
 private function f_tc_gsup_mo_sms(charstring id, BSC_ConnHdlrPars pars)
@@ -2243,6 +2524,15 @@
        vc_conn.done;
        f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
 }
+testcase TC_iu_gsup_mo_sms() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       f_vty_config(MSCVTY, "msc", "sms-over-gsup");
+       vc_conn := f_start_handler(refers(f_tc_gsup_mo_sms), 1088, ran_idx := 
2, ran_is_geran := false);
+       vc_conn.done;
+       f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
+}
+

 /* Test MO-SMMA from MS/BTS/BSC towards HLR (via GSUP) */
 private function f_tc_gsup_mo_smma(charstring id, BSC_ConnHdlrPars pars)
@@ -2299,6 +2589,15 @@
        vc_conn.done;
        f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
 }
+testcase TC_iu_gsup_mo_smma() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       f_vty_config(MSCVTY, "msc", "sms-over-gsup");
+       vc_conn := f_start_handler(refers(f_tc_gsup_mo_smma), 1089, ran_idx := 
2, ran_is_geran := false);
+       vc_conn.done;
+       f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
+}
+

 /* Helper for sending MT SMS over GSUP */
 private function f_gsup_forwardSM_req(SmsParameters spars, OCT1 mms := '00'O)
@@ -2380,6 +2679,17 @@
        vc_conn.done;
        f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
 }
+testcase TC_iu_gsup_mt_sms_ack() runs on MTC_CT {
+       var BSC_ConnHdlrPars pars;
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       pars := f_init_pars(1090, ran_idx := 2, ran_is_geran := false);
+       f_vty_config(MSCVTY, "msc", "sms-over-gsup");
+       vc_conn := f_start_handler_with_pars(refers(f_tc_gsup_mt_sms_ack), 
pars);
+       vc_conn.done;
+       f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
+}
+

 /* Test rejected MT-SMS (RP-ERROR) over GSUP */
 private function f_tc_gsup_mt_sms_err(charstring id, BSC_ConnHdlrPars pars)
@@ -2446,6 +2756,17 @@
        vc_conn.done;
        f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
 }
+testcase TC_iu_gsup_mt_sms_err() runs on MTC_CT {
+       var BSC_ConnHdlrPars pars;
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       pars := f_init_pars(1091, ran_idx := 2, ran_is_geran := false);
+       f_vty_config(MSCVTY, "msc", "sms-over-gsup");
+       vc_conn := f_start_handler_with_pars(refers(f_tc_gsup_mt_sms_err), 
pars);
+       vc_conn.done;
+       f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
+}
+

 /* Test SM-RP-MR assignment for MT-SMS over GSUP */
 private function f_tc_gsup_mt_sms_rp_mr(charstring id, BSC_ConnHdlrPars pars)
@@ -2558,6 +2879,17 @@
        vc_conn.done;
        f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
 }
+testcase TC_iu_gsup_mt_sms_rp_mr() runs on MTC_CT {
+       var BSC_ConnHdlrPars pars;
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       pars := f_init_pars(1092, ran_idx := 2, ran_is_geran := false);
+       f_vty_config(MSCVTY, "msc", "sms-over-gsup");
+       vc_conn := f_start_handler_with_pars(refers(f_tc_gsup_mt_sms_rp_mr), 
pars);
+       vc_conn.done;
+       f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
+}
+

 /* Test SM-RP-MR assignment for MT-SMS over GSUP */
 private function f_tc_gsup_mo_mt_sms_rp_mr(charstring id, BSC_ConnHdlrPars 
pars)
@@ -2662,6 +2994,17 @@
        vc_conn.done;
        f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
 }
+testcase TC_iu_gsup_mo_mt_sms_rp_mr() runs on MTC_CT {
+       var BSC_ConnHdlrPars pars;
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       pars := f_init_pars(1093, ran_idx := 2, ran_is_geran := false);
+       f_vty_config(MSCVTY, "msc", "sms-over-gsup");
+       vc_conn := f_start_handler_with_pars(refers(f_tc_gsup_mo_mt_sms_rp_mr), 
pars);
+       vc_conn.done;
+       f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
+}
+

 /* Test multi-part MT-SMS over GSUP */
 private function f_tc_gsup_mt_multi_part_sms(charstring id, BSC_ConnHdlrPars 
pars)
@@ -2696,7 +3039,7 @@

                /* Expect Paging Request and Establish connection */
                if (i == 3) { /* ... only once! */
-                       BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));
+                       f_expect_paging();
                        f_establish_fully(EST_TYPE_PAG_RESP);
                }

@@ -2977,6 +3320,13 @@
        vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_single_request), 
46);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mo_ussd_single_request() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_single_request), 
1046, ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* LU followed by MT USSD notification */
 private function f_tc_lu_and_mt_ussd_notification(charstring id, 
BSC_ConnHdlrPars pars)
@@ -3021,7 +3371,10 @@
        /* Send it to MSC and expect Paging Request */
        GSUP.send(gsup_req);
        alt {
-       [] BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi)) {
+       [pars.ran_is_geran] BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi)) {
+               setverdict(pass);
+               }
+       [not pars.ran_is_geran] BSSAP.receive(tr_RANAP_Paging(cs_domain, 
imsi_hex2oct(g_pars.imsi), ?)) {
                setverdict(pass);
                }
        /* We don't expect anything else */
@@ -3080,6 +3433,13 @@
        vc_conn := f_start_handler(refers(f_tc_lu_and_mt_ussd_notification), 
47);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mt_ussd_notification() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       vc_conn := f_start_handler(refers(f_tc_lu_and_mt_ussd_notification), 
1047, ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* LU followed by MT call and MO USSD request during this call */
 private function f_tc_lu_and_mo_ussd_during_mt_call(charstring id, 
BSC_ConnHdlrPars pars)
@@ -3166,6 +3526,12 @@
        vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_during_mt_call), 
48);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mo_ussd_during_mt_call() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_during_mt_call), 
1048, ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}

 /* BSSMAP Clear Request in the middle of a call, see OS#3062 */
 private function f_tc_mo_cc_bssmap_clear(charstring id, BSC_ConnHdlrPars pars) 
runs on BSC_ConnHdlr {
@@ -3192,15 +3558,28 @@
        MGCP.receive(tr_CRCX);

        f_sleep(1.0);
-       BSSAP.send(ts_BSSMAP_ClearRequest(0));
+       if (pars.ran_is_geran) {
+               BSSAP.send(ts_BSSMAP_ClearRequest(0));
+       } else {
+               
BSSAP.send(ts_RANAP_IuReleaseRequest(ts_RanapCause_om_intervention));
+       }

        var default ccrel := activate(as_optional_cc_rel(cpars));

-       interleave {
-       [] MNCC.receive(tr_MNCC_REL_ind(?, ?)) { };
-       [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
+       if (pars.ran_is_geran) {
+               interleave {
+               [] MNCC.receive(tr_MNCC_REL_ind(?, ?)) { };
+               [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
                        BSSAP.send(ts_BSSMAP_ClearComplete);
-               };
+                       };
+               }
+       } else {
+               interleave {
+               [] MNCC.receive(tr_MNCC_REL_ind(?, ?)) { };
+               [] BSSAP.receive(tr_RANAP_IuReleaseCommand(?)) {
+                       BSSAP.send(ts_RANAP_IuReleaseComplete);
+                       };
+               }
        }

        deactivate(ccrel);
@@ -3214,6 +3593,14 @@
        vc_conn := f_start_handler(refers(f_tc_mo_cc_bssmap_clear), 43);
        vc_conn.done;
 }
+testcase TC_mo_cc_iu_release() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+
+       vc_conn := f_start_handler(refers(f_tc_mo_cc_bssmap_clear), 1043, 
ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* LU followed by MT call and MT USSD request during this call */
 private function f_tc_lu_and_mt_ussd_during_mt_call(charstring id, 
BSC_ConnHdlrPars pars)
@@ -3316,6 +3703,13 @@
        vc_conn := f_start_handler(refers(f_tc_lu_and_mt_ussd_during_mt_call), 
49);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mt_ussd_during_mt_call() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       vc_conn := f_start_handler(refers(f_tc_lu_and_mt_ussd_during_mt_call), 
1049, ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* LU followed by MO USSD request and MO Release during transaction */
 private function f_tc_lu_and_mo_ussd_mo_release(charstring id, 
BSC_ConnHdlrPars pars)
@@ -3413,6 +3807,13 @@
        vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_mo_release), 50);
        vc_conn.done;
 }
+testcase TC_iu_lu_and_mo_ussd_mo_release() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init();
+       vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_mo_release), 
1050, ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+}
+

 /* LU followed by MO USSD request and MT Release due to timeout */
 private function f_tc_lu_and_ss_session_timeout(charstring id, 
BSC_ConnHdlrPars pars)
@@ -3485,6 +3886,15 @@
        vc_conn.done;
        f_vty_config(MSCVTY, "msc", "ncss guard-timeout 0");
 }
+testcase TC_iu_lu_and_ss_session_timeout() runs on MTC_CT {
+       var BSC_ConnHdlr vc_conn;
+       f_init(3);
+       f_vty_config(MSCVTY, "msc", "ncss guard-timeout 3");
+       vc_conn := f_start_handler(refers(f_tc_lu_and_ss_session_timeout), 
1051, ran_idx := 2, ran_is_geran := false);
+       vc_conn.done;
+       f_vty_config(MSCVTY, "msc", "ncss guard-timeout 0");
+}
+

 /* A5/1 only permitted on network side; attempt an invalid CIPHER MODE 
COMPLETE with A5/3 which MSC should reject. */
 private function f_tc_cipher_complete_with_invalid_cipher(charstring id, 
BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
@@ -3571,6 +3981,10 @@
    * too long / short TLV values
  */

+/***********************************************************************
+ * SGsAP Testing
+ ***********************************************************************/
+
 /* Check if a subscriber exists in the VLR */
 private function f_ctrl_subscr_in_vlr(charstring imsi_or_msisdn) runs on 
BSC_ConnHdlr return boolean {

@@ -3603,7 +4017,10 @@
        f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " 
paging");

        alt {
-       [] BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi)); {
+       [g_pars.ran_is_geran] BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi)); {
+               setverdict(pass);
+               }
+       [not g_pars.ran_is_geran] BSSAP.receive(tr_RANAP_Paging(cs_domain, 
imsi_hex2oct(g_pars.imsi), ?)) {
                setverdict(pass);
                }
        [] SGsAP.receive {
@@ -4682,22 +5099,37 @@
        execute( TC_lu_imsi_noauth_tmsi() );
        execute( TC_lu_imsi_noauth_notmsi() );
        execute( TC_lu_imsi_reject() );
+       execute( TC_iu_lu_imsi_reject() );
        execute( TC_lu_imsi_timeout_gsup() );
+       execute( TC_iu_lu_imsi_timeout_gsup() );
        execute( TC_lu_imsi_auth_tmsi() );
        execute( TC_lu_imsi_auth3g_tmsi() );
+       execute( TC_iu_lu_imsi_auth3g_tmsi() );
        execute( TC_cmserv_imsi_unknown() );
+       execute( TC_iu_cmserv_imsi_unknown() );
        execute( TC_lu_and_mo_call() );
+       execute( TC_iu_lu_and_mo_call() );
        execute( TC_lu_auth_sai_timeout() );
+       execute( TC_iu_lu_auth_sai_timeout() );
        execute( TC_lu_auth_sai_err() );
+       execute( TC_iu_lu_auth_sai_err() );
        execute( TC_lu_clear_request() );
+       execute( TC_iu_lu_release_request() );
        execute( TC_lu_disconnect() );
+       execute( TC_iu_lu_disconnect() );
        execute( TC_lu_by_imei() );
+       execute( TC_iu_lu_by_imei() );
        execute( TC_lu_by_tmsi_noauth_unknown() );
        execute( TC_imsi_detach_by_imsi() );
+       execute( TC_iu_imsi_detach_by_imsi() );
        execute( TC_imsi_detach_by_tmsi() );
+       execute( TC_iu_imsi_detach_by_tmsi() );
        execute( TC_imsi_detach_by_imei() );
+       execute( TC_iu_imsi_detach_by_imei() );
        execute( TC_emerg_call_imei_reject() );
+       execute( TC_iu_emerg_call_imei_reject() );
        execute( TC_emerg_call_imsi() );
+       execute( TC_iu_emerg_call_imsi() );
        execute( TC_cm_serv_req_vgcs_reject() );
        execute( TC_cm_serv_req_vbs_reject() );
        execute( TC_cm_serv_req_lcs_reject() );
@@ -4707,13 +5139,19 @@
        execute( TC_cl3_no_payload() );
        execute( TC_cl3_rnd_payload() );
        execute( TC_establish_and_nothing() );
+       execute( TC_iu_establish_and_nothing() );
        execute( TC_mo_setup_and_nothing() );
+       execute( TC_iu_mo_setup_and_nothing() );
        execute( TC_mo_crcx_ran_timeout() );
+       execute( TC_iu_mo_crcx_ran_timeout() );
        execute( TC_mo_crcx_ran_reject() );
+       execute( TC_iu_mo_crcx_ran_reject() );
        execute( TC_mt_crcx_ran_reject() );
+       execute( TC_iu_mt_crcx_ran_reject() );
        execute( TC_mo_setup_and_dtmf_dup() );
        //execute( TC_mt_t310() );
        execute( TC_gsup_cancel() );
+       execute( TC_iu_gsup_cancel() );
        execute( TC_lu_imsi_auth_tmsi_encr_1_13() );
        execute( TC_lu_imsi_auth_tmsi_encr_3_13() );
        execute( TC_lu_imsi_auth_tmsi_encr_3_1() );
@@ -4721,30 +5159,48 @@
        execute( TC_lu_imsi_auth_tmsi_encr_13_2() );
        execute( TC_lu_imsi_auth_tmsi_encr_013_2() );
        execute( TC_mo_release_timeout() );
+       execute( TC_iu_mo_release_timeout() );
        execute( TC_lu_and_mt_call_no_dlcx_resp() );
        execute( TC_reset_two() );
+       execute( TC_reset_two_1iu() );

        execute( TC_lu_and_mt_call() );

        execute( TC_lu_and_mo_sms() );
+       execute( TC_iu_lu_and_mo_sms() );
        execute( TC_lu_and_mt_sms() );
+       execute( TC_iu_lu_and_mt_sms() );
        execute( TC_lu_and_mt_sms_paging_and_nothing() );
+       execute( TC_iu_lu_and_mt_sms_paging_and_nothing() );
        execute( TC_smpp_mo_sms() );
+       execute( TC_iu_smpp_mo_sms() );
        execute( TC_smpp_mt_sms() );

        execute( TC_gsup_mo_sms() );
+       execute( TC_iu_gsup_mo_sms() );
        execute( TC_gsup_mo_smma() );
+       execute( TC_iu_gsup_mo_smma() );
        execute( TC_gsup_mt_sms_ack() );
+       execute( TC_iu_gsup_mt_sms_ack() );
        execute( TC_gsup_mt_sms_err() );
+       execute( TC_iu_gsup_mt_sms_err() );
        execute( TC_gsup_mt_sms_rp_mr() );
+       execute( TC_iu_gsup_mt_sms_rp_mr() );
        execute( TC_gsup_mo_mt_sms_rp_mr() );
+       execute( TC_iu_gsup_mo_mt_sms_rp_mr() );

        execute( TC_lu_and_mo_ussd_single_request() );
+       execute( TC_iu_lu_and_mo_ussd_single_request() );
        execute( TC_lu_and_mt_ussd_notification() );
+       execute( TC_iu_lu_and_mt_ussd_notification() );
        execute( TC_lu_and_mo_ussd_during_mt_call() );
+       execute( TC_iu_lu_and_mo_ussd_during_mt_call() );
        execute( TC_lu_and_mt_ussd_during_mt_call() );
+       execute( TC_iu_lu_and_mt_ussd_during_mt_call() );
        execute( TC_lu_and_mo_ussd_mo_release() );
+       execute( TC_iu_lu_and_mo_ussd_mo_release() );
        execute( TC_lu_and_ss_session_timeout() );
+       execute( TC_iu_lu_and_ss_session_timeout() );

        execute( TC_cipher_complete_with_invalid_cipher() );

@@ -4770,11 +5226,13 @@
        execute( TC_bssap_lu_sgsap_lu_and_mt_call() );
        execute( TC_sgsap_lu_and_mt_call() );
        execute( TC_sgsap_vlr_failure() );
+       /* TODO: Iu + SGsAP related tests, e.g. paging on IuCS */

        /* Run this last: at the time of writing this test crashes the MSC */
        execute( TC_lu_imsi_auth_tmsi_encr_3_1_log_msc_debug() );
        execute( TC_gsup_mt_multi_part_sms() );
        execute( TC_mo_cc_bssmap_clear() );
+       execute( TC_mo_cc_iu_release() );
 }



--
To view, visit https://gerrit.osmocom.org/13753
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3b56e17487c9df839e67ed390a1ff89979683e8e
Gerrit-Change-Number: 13753
Gerrit-PatchSet: 1
Gerrit-Owner: Harald Welte <[email protected]>

Reply via email to