<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13751">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
Harald Welte: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">msc: Add RANAP to msc tests<br><br>Integrate RANAP to MSC_Tests.ttcn<br><br>Related: OS#2856<br>Change-Id: Idfa54b7607ad6e7016ed9411b0cc5330c901ea34<br>---<br>M msc/BSC_ConnectionHandler.ttcn<br>M msc/MSC_Tests.default<br>M msc/MSC_Tests.ttcn<br>M msc/gen_links.sh<br>M msc/regen_makefile.sh<br>5 files changed, 319 insertions(+), 78 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn</span><br><span>index 11baf2a..e603035 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -10,6 +10,12 @@</span><br><span> import from RAN_Emulation all;</span><br><span> import from BSSMAP_Templates all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from RANAP_Constants all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RANAP_IEs all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RANAP_PDU_Contents all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RANAP_PDU_Descriptions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RANAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> import from GSUP_Types all;</span><br><span> import from GSUP_Emulation all;</span><br><span> </span><br><span>@@ -76,9 +82,29 @@</span><br><span> boolean sgsap_enable,</span><br><span> boolean gsup_enable,</span><br><span> integer ran_idx,</span><br><span style="color: hsl(0, 100%, 40%);">- boolean use_umts_aka</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean use_umts_aka,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean ran_is_geran</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function imsi_hex2oct(hexstring imsi) return octetstring {</span><br><span style="color: hsl(120, 100%, 40%);">+ var hexstring tmp := ''H;</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring ret;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* swap nibbles and pad with F if insufficient input nibbles */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < lengthof(imsi); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i+1 < lengthof(imsi)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ tmp := tmp & imsi[i+1];</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ tmp := tmp & 'F'H;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ tmp := tmp & imsi[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ i := i+1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ ret := hex2oct(tmp);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* get a one-octet bitmaks of supported algorithms based on Classmark information */</span><br><span> function f_alg_mask_from_cm(BSSMAP_IE_ClassmarkInformationType2 cm2) return OCT1 {</span><br><span> var BIT8 res := '00000001'B; /* A5/0 always supported */</span><br><span>@@ -174,10 +200,31 @@</span><br><span> return resp;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function RncUnitdataCallback(RANAP_PDU ranap)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAN_Emulation_CT return template RANAP_PDU {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template RANAP_PDU resp := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ log("RANAP_RncUnitdataCallback");</span><br><span style="color: hsl(120, 100%, 40%);">+ /* answer all RESET with RESET ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(ranap, tr_RANAP_Reset)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ log("RANAP_RncUnitdataCallback: Responding to RESET with RESET-ACK");</span><br><span style="color: hsl(120, 100%, 40%);">+ var CN_DomainIndicator dom;</span><br><span style="color: hsl(120, 100%, 40%);">+ dom := ranap.initiatingMessage.value_.Reset.protocolIEs[1].value_.cN_DomainIndicator;</span><br><span style="color: hsl(120, 100%, 40%);">+ resp := ts_RANAP_ResetAck(dom);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: Handle paging, etc. */</span><br><span style="color: hsl(120, 100%, 40%);">+ return resp;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const RanOps BSC_RanOps := {</span><br><span> /* Create call-back for inbound connections from MSC (hand-over) */</span><br><span> create_cb := refers(RAN_Emulation.ExpectedCreateCallback),</span><br><span> unitdata_cb := refers(BscUnitdataCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+ ranap_create_cb := refers(RAN_Emulation.RanapExpectedCreateCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+ ranap_unitdata_cb := refers(RncUnitdataCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+ ps_domain := false,</span><br><span> decode_dtap := true,</span><br><span> role_ms := true,</span><br><span> protocol := RAN_PROTOCOL_BSSAP,</span><br><span>@@ -215,6 +262,55 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* generate Iu LAI from BSSAP CGI */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_IuLAI_from_BssmapCI(BSSMAP_IE_CellIdentifier ci) return LAI {</span><br><span style="color: hsl(120, 100%, 40%);">+ var LAI lai;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ischosen(ci.cellIdentification.cI_CGI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ lai.pLMNidentity := ci.cellIdentification.cI_CGI.mcc_mnc;</span><br><span style="color: hsl(120, 100%, 40%);">+ lai.lAC := ci.cellIdentification.cI_CGI.lac;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(ci.cellIdentification.cI_SAI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ lai.pLMNidentity := ci.cellIdentification.cI_SAI.mcc_mnc;</span><br><span style="color: hsl(120, 100%, 40%);">+ lai.lAC := ci.cellIdentification.cI_SAI.lac;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(ci.cellIdentification.ci_LAC_RNC_CI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ lai.pLMNidentity := ci.cellIdentification.ci_LAC_RNC_CI.mcc_mnc;</span><br><span style="color: hsl(120, 100%, 40%);">+ lai.lAC := ci.cellIdentification.ci_LAC_RNC_CI.lac;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ lai.iE_Extensions := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+ return lai;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* like f_bssap_compl_l3() but for 3G */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ranap_initial_ue(PDU_ML3_MS_NW l3)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Sending InitialUE: ", l3);</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3);</span><br><span style="color: hsl(120, 100%, 40%);">+ var RANAP_PDU ranap;</span><br><span style="color: hsl(120, 100%, 40%);">+ var LAI lai := f_IuLAI_from_BssmapCI(g_pars.cell_id);</span><br><span style="color: hsl(120, 100%, 40%);">+ var SAI sai := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pLMNidentity := lai.pLMNidentity,</span><br><span style="color: hsl(120, 100%, 40%);">+ lAC := lai.lAC,</span><br><span style="color: hsl(120, 100%, 40%);">+ sAC := '0000'O, /* FIXME */</span><br><span style="color: hsl(120, 100%, 40%);">+ iE_Extensions := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+ var IuSignallingConnectionIdentifier sigc_id := int2bit(23, 24);</span><br><span style="color: hsl(120, 100%, 40%);">+ var GlobalRNC_ID grnc_id := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pLMNidentity := lai.pLMNidentity,</span><br><span style="color: hsl(120, 100%, 40%);">+ rNC_ID := 2342 /* FIXME */</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ranap := valueof(ts_RANAP_initialUE_CS(lai, sai, l3_enc, sigc_id, grnc_id));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_RANAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own, ranap));</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "DISC.ind from SCCP");</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type enumerated EstablishType {</span><br><span> EST_TYPE_MO_CALL,</span><br><span> EST_TYPE_EMERG_CALL,</span><br><span>@@ -255,7 +351,11 @@</span><br><span> }</span><br><span> </span><br><span> /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */</span><br><span style="color: hsl(0, 100%, 40%);">- f_bssap_compl_l3(l3_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssap_compl_l3(l3_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ranap_initial_ue(l3_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> f_mm_common();</span><br><span> if (g_pars.net.expect_ciph) {</span><br><span>@@ -329,21 +429,51 @@</span><br><span> function f_mm_common() runs on BSC_ConnHdlr</span><br><span> {</span><br><span> f_mm_auth();</span><br><span style="color: hsl(0, 100%, 40%);">- if (g_pars.net.expect_ciph) {</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT1 a5_net := f_alg_mask_from_cm(g_pars.cm2);</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT1 a5_intersect := g_pars.net.kc_support and4b a5_net;</span><br><span style="color: hsl(0, 100%, 40%);">- alt {</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(a5_intersect, g_pars.vec.kc)) {</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT1 a5_chosen := f_best_alg_from_mask(a5_intersect);</span><br><span style="color: hsl(0, 100%, 40%);">- var integer a5_nr := f_alg_from_mask(a5_chosen);</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_BSSMAP_CipherModeCompl(int2oct(a5_nr+1, 1)));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.net.expect_ciph) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT1 a5_net := f_alg_mask_from_cm(g_pars.cm2);</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT1 a5_intersect := g_pars.net.kc_support and4b a5_net;</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(a5_intersect, g_pars.vec.kc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT1 a5_chosen := f_best_alg_from_mask(a5_intersect);</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer a5_nr := f_alg_from_mask(a5_chosen);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_CipherModeCompl(int2oct(a5_nr+1, 1)));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?, g_pars.vec.kc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Wrong ciphering algorithm mask in CiphModCmd");</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?, g_pars.vec.kc)) {</span><br><span style="color: hsl(0, 100%, 40%);">- setverdict(fail, "Wrong ciphering algorithm mask in CiphModCmd");</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: Send the best available algorithm */</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else { /* UTRAN */</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(uia_algs := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ uia_key := oct2bit(g_pars.vec.ik),</span><br><span style="color: hsl(120, 100%, 40%);">+ key_sts := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ uea_algs := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ uea_key := oct2bit(g_pars.vec.ck))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1*/</span><br><span style="color: hsl(120, 100%, 40%);">+ var EncryptionAlgorithm uea_chosen := 1; /*standard_UMTS_encryption_algorith_UEA1*/</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_RANAP_SecurityModeCompleteEnc(uia_chosen, uea_chosen));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(?,?,?,?,?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Invalid SecurityModeCommand (ciphering case)");</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ uia_key := oct2bit(g_pars.vec.ik),</span><br><span style="color: hsl(120, 100%, 40%);">+ key_sts := ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1;*/</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(?,?,?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Invalid SecurityModeCommand (non-ciphering case)");</span><br><span> mtc.stop;</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Send the best available algorithm */</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -362,10 +492,13 @@</span><br><span> f_create_gsup_expect(hex2str(g_pars.imsi));</span><br><span> </span><br><span> /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */</span><br><span style="color: hsl(0, 100%, 40%);">- f_bssap_compl_l3(l3_lu);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (g_pars.send_early_cm) {</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssap_compl_l3(l3_lu);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.send_early_cm) {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ranap_initial_ue(l3_lu);</span><br><span> }</span><br><span> </span><br><span> f_mm_common();</span><br><span>@@ -544,27 +677,44 @@</span><br><span> MGCP.send(mgcp_resp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- var BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=</span><br><span style="color: hsl(0, 100%, 40%);">- valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_rtp_ip_bss),cpars.mgw_rtp_port_bss));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- interleave {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span style="color: hsl(0, 100%, 40%);">- [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(0, 100%, 40%);">- var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(0, 100%, 40%);">- MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(0, 100%, 40%);">- /* MSC acknowledges the MNCC_CREATE to the MNCC handler */</span><br><span style="color: hsl(0, 100%, 40%);">- MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_rtp_ip_bss),cpars.mgw_rtp_port_bss));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+ var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MSC acknowledges the MNCC_CREATE to the MNCC handler */</span><br><span style="color: hsl(120, 100%, 40%);">+ MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* expect the MSC to trigger a BSSMAP ASSIGNMENT */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_AoIP_TransportLayerAddress tla;</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_SpeechCodec codec;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));</span><br><span style="color: hsl(120, 100%, 40%);">+ codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_AssignmentComplete(omit, tla, codec));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template TransportLayerAddress rab_tla := ? /* FIXME: encode the mgw_rtp_ip_bss/mgw_rtp_port_bss */</span><br><span style="color: hsl(120, 100%, 40%);">+ var template RAB_SetupOrModifyList rab_sml := tr_RAB_SML(rab_id := ?, tla := rab_tla, binding_id := ?);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* expect the MSC to trigger a BSSMAP ASSIGNMENT */</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) {</span><br><span style="color: hsl(0, 100%, 40%);">- var BSSMAP_IE_AoIP_TransportLayerAddress tla;</span><br><span style="color: hsl(0, 100%, 40%);">- var BSSMAP_IE_SpeechCodec codec;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));</span><br><span style="color: hsl(0, 100%, 40%);">- codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_BSSMAP_AssignmentComplete(omit, tla, codec));</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+ var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MSC acknowledges the MNCC_CREATE to the MNCC handler */</span><br><span style="color: hsl(120, 100%, 40%);">+ MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_RANAP_RabAssReq(rab_sml)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ //BSSAP.send(ts_RANAP_RabAssResp(rab_sml)); FIXME</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -575,7 +725,11 @@</span><br><span> </span><br><span> function f_expect_paging(boolean by_tmsi := true)</span><br><span> runs on BSC_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_RANAP_Paging(cs_domain, imsi_hex2oct(g_pars.imsi), ?));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> function f_mt_call_establish(inout CallParameters cpars)</span><br><span>@@ -649,27 +803,51 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- var BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=</span><br><span style="color: hsl(0, 100%, 40%);">- valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_rtp_ip_bss),cpars.mgw_rtp_port_bss));</span><br><span style="color: hsl(0, 100%, 40%);">- interleave {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span style="color: hsl(0, 100%, 40%);">- [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(0, 100%, 40%);">- var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(0, 100%, 40%);">- MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_rtp_ip_bss),cpars.mgw_rtp_port_bss));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Alerting */</span><br><span style="color: hsl(0, 100%, 40%);">- MNCC.send(ts_MNCC_ALERT_req(cpars.mncc_callref));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+ var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Alerting */</span><br><span style="color: hsl(120, 100%, 40%);">+ MNCC.send(ts_MNCC_ALERT_req(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* expect AoIP IP/Port to match what we returned in CRCX_ACK above */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_AoIP_TransportLayerAddress tla;</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_SpeechCodec codec;</span><br><span style="color: hsl(120, 100%, 40%);">+ tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));</span><br><span style="color: hsl(120, 100%, 40%);">+ codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_AssignmentComplete(omit, tla, codec));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- /* expect AoIP IP/Port to match what we returned in CRCX_ACK above */</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) {</span><br><span style="color: hsl(0, 100%, 40%);">- var BSSMAP_IE_AoIP_TransportLayerAddress tla;</span><br><span style="color: hsl(0, 100%, 40%);">- var BSSMAP_IE_SpeechCodec codec;</span><br><span style="color: hsl(0, 100%, 40%);">- tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));</span><br><span style="color: hsl(0, 100%, 40%);">- codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_BSSMAP_AssignmentComplete(omit, tla, codec));</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template TransportLayerAddress rab_tla := ?; /* FIXME: encode the mgw_rtp_ip_bss/mgw_rtp_port_bss */</span><br><span style="color: hsl(120, 100%, 40%);">+ var template RAB_SetupOrModifyList rab_sml := tr_RAB_SML(rab_id := ?, tla := rab_tla, binding_id := ?);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+ var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Alerting */</span><br><span style="color: hsl(120, 100%, 40%);">+ MNCC.send(ts_MNCC_ALERT_req(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_RANAP_RabAssReq(rab_sml)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ //BSSAP.send(ts_RANAP_RabAssResp(rab_sml)); FIXME</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -688,12 +866,6 @@</span><br><span> var MNCC_PDU mncc;</span><br><span> var MgcpCommand mgcp_cmd;</span><br><span> var boolean respond_to_dlcx;</span><br><span style="color: hsl(0, 100%, 40%);">- var template PDU_BSSAP t_clear := tr_BSSMAP_ClearCommand;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (is_csfb) {</span><br><span style="color: hsl(0, 100%, 40%);">- t_clear := tr_BSSMAP_ClearCommandCSFB;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> MNCC.send(ts_MNCC_DISC_req(cpars.mncc_callref, valueof(ts_MNCC_cause(23))));</span><br><span> BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id)));</span><br><span> </span><br><span>@@ -711,18 +883,43 @@</span><br><span> </span><br><span> respond_to_dlcx := not (isbound(cpars.mgw_drop_dlcx) and valueof(cpars.mgw_drop_dlcx));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* clearing of radio channel */</span><br><span style="color: hsl(0, 100%, 40%);">- interleave {</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(t_clear) {</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_BSSMAP_ClearComplete);</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* clearing of radio channel */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template PDU_BSSAP t_clear := tr_BSSMAP_ClearCommand;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (is_csfb) {</span><br><span style="color: hsl(120, 100%, 40%);">+ t_clear := tr_BSSMAP_ClearCommandCSFB;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(0, 100%, 40%);">- if (respond_to_dlcx) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: For one or all connections on EP? */</span><br><span style="color: hsl(0, 100%, 40%);">- MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span style="color: hsl(0, 100%, 40%);">- f_create_mgcp_delete_ep(cpars.mgcp_ep);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(t_clear) {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (respond_to_dlcx) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: For one or all connections on EP? */</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_mgcp_delete_ep(cpars.mgcp_ep);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template RANAP_PDU t_iurel := tr_RANAP_IuReleaseCommand(?);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (is_csfb) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME! */</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(t_iurel) {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_RANAP_IuReleaseComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (respond_to_dlcx) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: For one or all connections on EP? */</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_mgcp_delete_ep(cpars.mgcp_ep);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -809,6 +1006,7 @@</span><br><span> </span><br><span> setverdict(pass);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* expect a clear command */</span><br><span> altstep as_clear_cmd_compl_disc(float t := 5.0) runs on BSC_ConnHdlr {</span><br><span> var PDU_BSSAP bssap;</span><br><span>@@ -830,12 +1028,34 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* expect a IuReleaseCommand; Confirm that; expect SCCP-level N-DISCONNET.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_iu_release_compl_disc(float t := 5.0) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var RANAP_PDU ranap;</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_RANAP_IuReleaseCommand(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_RANAP_IuReleaseComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Unexpected RANAP while waiting for SCCP Release ");</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(RANAP_PDU:?) -> value ranap{</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Unexpected RANAP while waiting for IuReleaseCommand", ranap);</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_expect_clear(float t := 5.0) runs on BSC_ConnHdlr {</span><br><span> timer T := t;</span><br><span> </span><br><span> T.start;</span><br><span> alt {</span><br><span style="color: hsl(0, 100%, 40%);">- [] as_clear_cmd_compl_disc(t) { }</span><br><span style="color: hsl(120, 100%, 40%);">+ [g_pars.ran_is_geran] as_clear_cmd_compl_disc(t) { }</span><br><span style="color: hsl(120, 100%, 40%);">+ [not g_pars.ran_is_geran] as_iu_release_compl_disc(t) { }</span><br><span> [] T.timeout {</span><br><span> setverdict(fail, "Timeout waiting for ClearCommand/Release");</span><br><span> mtc.stop;</span><br><span>diff --git a/msc/MSC_Tests.default b/msc/MSC_Tests.default</span><br><span>index a24fa38..98bf299 100644</span><br><span>--- a/msc/MSC_Tests.default</span><br><span>+++ b/msc/MSC_Tests.default</span><br><span>@@ -48,6 +48,17 @@</span><br><span> peer_ssn := 254,</span><br><span> sio := '83'O,</span><br><span> rctx := 1</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ transport := RANAP_TRANSPORT_IuCS,</span><br><span style="color: hsl(120, 100%, 40%);">+ sccp_service_type := "mtp3_itu",</span><br><span style="color: hsl(120, 100%, 40%);">+ sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" },</span><br><span style="color: hsl(120, 100%, 40%);">+ own_pc := 195,</span><br><span style="color: hsl(120, 100%, 40%);">+ own_ssn := 142,</span><br><span style="color: hsl(120, 100%, 40%);">+ peer_pc := 185,</span><br><span style="color: hsl(120, 100%, 40%);">+ peer_ssn := 142,</span><br><span style="color: hsl(120, 100%, 40%);">+ sio := '83'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ rctx := 2</span><br><span> }</span><br><span> };</span><br><span> </span><br><span>diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn</span><br><span>index b2503b7..110c165 100644</span><br><span>--- a/msc/MSC_Tests.ttcn</span><br><span>+++ b/msc/MSC_Tests.ttcn</span><br><span>@@ -65,7 +65,7 @@</span><br><span> </span><br><span> import from TCCConversion_Functions all;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const integer NUM_BSC := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+const integer NUM_BSC := 3;</span><br><span> type record of RAN_Configuration RAN_Configurations;</span><br><span> </span><br><span> /* Needed for SGsAP SMS */</span><br><span>@@ -485,7 +485,8 @@</span><br><span> type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr;</span><br><span> </span><br><span> /* FIXME: move into BSC_ConnectionHandler? */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_init_pars(integer imsi_suffix, boolean sgsap := false, boolean gsup := true, integer ran_idx := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+function f_init_pars(integer imsi_suffix, boolean sgsap := false, boolean gsup := true, integer ran_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean ran_is_geran := true)</span><br><span> runs on MTC_CT return BSC_ConnHdlrPars {</span><br><span> var BSC_ConnHdlrNetworkPars net_pars := {</span><br><span> kc_support := '0A'O, /* A5/1 and A5/3 enabled */</span><br><span>@@ -514,7 +515,8 @@</span><br><span> sgsap_enable := sgsap,</span><br><span> gsup_enable := gsup,</span><br><span> ran_idx := ran_idx,</span><br><span style="color: hsl(0, 100%, 40%);">- use_umts_aka := false</span><br><span style="color: hsl(120, 100%, 40%);">+ use_umts_aka := false,</span><br><span style="color: hsl(120, 100%, 40%);">+ ran_is_geran := ran_is_geran</span><br><span> };</span><br><span> return pars;</span><br><span> }</span><br><span>@@ -553,8 +555,9 @@</span><br><span> return vc_conn;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_start_handler(void_fn fn, integer imsi_suffix, integer ran_idx := 0) runs on MTC_CT return BSC_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">- return f_start_handler_with_pars(fn, f_init_pars(imsi_suffix, ran_idx := ran_idx));</span><br><span style="color: hsl(120, 100%, 40%);">+function f_start_handler(void_fn fn, integer imsi_suffix, integer ran_idx := 0, boolean ran_is_geran := true)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MTC_CT return BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ return f_start_handler_with_pars(fn, f_init_pars(imsi_suffix, ran_idx := ran_idx, ran_is_geran := ran_is_geran));</span><br><span> }</span><br><span> </span><br><span> private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span>diff --git a/msc/gen_links.sh b/msc/gen_links.sh</span><br><span>index e4e142b..7ba190a 100755</span><br><span>--- a/msc/gen_links.sh</span><br><span>+++ b/msc/gen_links.sh</span><br><span>@@ -85,6 +85,11 @@</span><br><span> FILES="SGsAP_Types.ttcn"</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DIR=../library/ranap</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="RANAP_CommonDataTypes.asn RANAP_Constants.asn RANAP_Containers.asn RANAP_IEs.asn RANAP_PDU_Contents.asn RANAP_PDU_Descriptions.asn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="RANAP_Types.ttcn RANAP_Templates.ttcn RANAP_CodecPort.ttcn RANAP_EncDec.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DIR=../library</span><br><span> FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "</span><br><span> FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc GSUP_Types.ttcn GSUP_Emulation.ttcn "</span><br><span>diff --git a/msc/regen_makefile.sh b/msc/regen_makefile.sh</span><br><span>index 091faf8..e89daa6 100755</span><br><span>--- a/msc/regen_makefile.sh</span><br><span>+++ b/msc/regen_makefile.sh</span><br><span>@@ -1,7 +1,9 @@</span><br><span> #!/bin/sh</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc SCTPasp_PT.cc TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc SMPP_EncDec.cc SMPP_CodecPort_CtrlFunctDef.cc MAP_EncDec.cc SS_EncDec.cc TCCEncoding.cc SGsAP_CodecPort_CtrlFunctDef.cc *.c *.asn"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc SCTPasp_PT.cc TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc SMPP_EncDec.cc SMPP_CodecPort_CtrlFunctDef.cc MAP_EncDec.cc SS_EncDec.cc TCCEncoding.cc SGsAP_CodecPort_CtrlFunctDef.cc RANAP_EncDec.cc *.c *.asn"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-export CPPFLAGS_TTCN3="-DIPA_EMULATION_MGCP -DIPA_EMULATION_GSUP -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DUSE_MTP3_DISTRIBUTOR"</span><br><span style="color: hsl(120, 100%, 40%);">+export CPPFLAGS_TTCN3="-DIPA_EMULATION_MGCP -DIPA_EMULATION_GSUP -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DRAN_EMULATION_RANAP -DUSE_MTP3_DISTRIBUTOR"</span><br><span> </span><br><span> ../regen-makefile.sh MSC_Tests.ttcn $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sed -i -e 's/^LINUX_LIBS = -lxml2/LINUX_LIBS = -lxml2 -lfftranscode/' Makefile</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13751">change 13751</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13751"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Idfa54b7607ad6e7016ed9411b0cc5330c901ea34 </div>
<div style="display:none"> Gerrit-Change-Number: 13751 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>