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