<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13651">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">RAN_Emulation: Modularize protocol support<br><br>The RAN_Emulation currently unconditionally provides BSSAP and MGCP support.<br>Let's re-structure the code so that support for those protocols is now<br>possible to enable/disable at compile time.<br><br>This patch is in preparation of introducing RANAP support in RAN_Emulation.<br><br>Change-Id: Id53ba3ff05f9946230e0e4a759245de14a0f9fbd<br>Related: OS#2856<br>---<br>M bsc-nat/BSC_MS_ConnectionHandler.ttcn<br>M bsc-nat/MSC_ConnectionHandler.ttcn<br>M bsc-nat/gen_links.sh<br>M bsc-nat/regen_makefile.sh<br>M bsc/MSC_ConnectionHandler.ttcn<br>M bsc/gen_links.sh<br>M bsc/regen_makefile.sh<br>R library/RAN_Adapter.ttcnpp<br>R library/RAN_Emulation.ttcnpp<br>M msc/BSC_ConnectionHandler.ttcn<br>M msc/gen_links.sh<br>M msc/regen_makefile.sh<br>12 files changed, 216 insertions(+), 141 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/51/13651/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc-nat/BSC_MS_ConnectionHandler.ttcn b/bsc-nat/BSC_MS_ConnectionHandler.ttcn</span><br><span>index 63d0451..e52b678 100644</span><br><span>--- a/bsc-nat/BSC_MS_ConnectionHandler.ttcn</span><br><span>+++ b/bsc-nat/BSC_MS_ConnectionHandler.ttcn</span><br><span>@@ -53,6 +53,7 @@</span><br><span>     unitdata_cb := refers(UnitdataCallback),</span><br><span>     decode_dtap := false,</span><br><span>        role_ms := true,</span><br><span style="color: hsl(120, 100%, 40%);">+      protocol := RAN_PROTOCOL_BSSAP,</span><br><span>      sccp_addr_local := omit,</span><br><span>     sccp_addr_peer := omit</span><br><span> }</span><br><span>diff --git a/bsc-nat/MSC_ConnectionHandler.ttcn b/bsc-nat/MSC_ConnectionHandler.ttcn</span><br><span>index 383b67b..8635a29 100644</span><br><span>--- a/bsc-nat/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc-nat/MSC_ConnectionHandler.ttcn</span><br><span>@@ -59,6 +59,7 @@</span><br><span>         unitdata_cb := refers(UnitdataCallback),</span><br><span>     decode_dtap := false,</span><br><span>        role_ms := false,</span><br><span style="color: hsl(120, 100%, 40%);">+     protocol := RAN_PROTOCOL_BSSAP,</span><br><span>      sccp_addr_local := omit,</span><br><span>     sccp_addr_peer := omit</span><br><span> }</span><br><span>diff --git a/bsc-nat/gen_links.sh b/bsc-nat/gen_links.sh</span><br><span>index e54eec4..16e32b7 100755</span><br><span>--- a/bsc-nat/gen_links.sh</span><br><span>+++ b/bsc-nat/gen_links.sh</span><br><span>@@ -47,7 +47,7 @@</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> DIR=../library</span><br><span style="color: hsl(0, 100%, 40%);">-FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn BSSAP_CodecPort.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn BSSAP_CodecPort.ttcn"</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> ignore_pp_results</span><br><span>diff --git a/bsc-nat/regen_makefile.sh b/bsc-nat/regen_makefile.sh</span><br><span>index c5fe64c..f49df7e 100755</span><br><span>--- a/bsc-nat/regen_makefile.sh</span><br><span>+++ b/bsc-nat/regen_makefile.sh</span><br><span>@@ -4,6 +4,6 @@</span><br><span> </span><br><span> FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc RTP_EncDec.cc SDP_EncDec.cc *.c MGCP_CodecPort_CtrlFunctDef.cc"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-export CPPFLAGS_TTCN3="-DIPA_EMULATION_SCCP -DIPA_EMULATION_MGCP -DUSE_MTP3_DISTRIBUTOR"</span><br><span style="color: hsl(120, 100%, 40%);">+export CPPFLAGS_TTCN3="-DIPA_EMULATION_SCCP -DIPA_EMULATION_MGCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DUSE_MTP3_DISTRIBUTOR"</span><br><span> </span><br><span> ../regen-makefile.sh $MAIN $FILES</span><br><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index 36e554d..520cc3e 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -376,6 +376,7 @@</span><br><span>         unitdata_cb := refers(UnitdataCallback),</span><br><span>     decode_dtap := false,</span><br><span>        role_ms := false,</span><br><span style="color: hsl(120, 100%, 40%);">+     protocol := RAN_PROTOCOL_BSSAP,</span><br><span>      sccp_addr_local := omit,</span><br><span>     sccp_addr_peer := omit</span><br><span> }</span><br><span>diff --git a/bsc/gen_links.sh b/bsc/gen_links.sh</span><br><span>index d8393c3..a4f09f4 100755</span><br><span>--- a/bsc/gen_links.sh</span><br><span>+++ b/bsc/gen_links.sh</span><br><span>@@ -67,7 +67,7 @@</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> DIR=../library</span><br><span style="color: hsl(0, 100%, 40%);">-FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn RAN_Adapter.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn SCCP_Templates.ttcn IPA_Testing.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn RAN_Adapter.ttcnpp Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn SCCP_Templates.ttcn IPA_Testing.ttcn"</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> ignore_pp_results</span><br><span>diff --git a/bsc/regen_makefile.sh b/bsc/regen_makefile.sh</span><br><span>index 08629d2..06fa812 100755</span><br><span>--- a/bsc/regen_makefile.sh</span><br><span>+++ b/bsc/regen_makefile.sh</span><br><span>@@ -4,6 +4,6 @@</span><br><span> </span><br><span> FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SCTPasp_PT.cc RTP_EncDec.cc SDP_EncDec.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc IuUP_EncDec.cc Native_FunctionDefs.cc TELNETasp_PT.cc *.c"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP -DIPA_EMULATION_SCCP -DUSE_MTP3_DISTRIBUTOR"</span><br><span style="color: hsl(120, 100%, 40%);">+export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DUSE_MTP3_DISTRIBUTOR"</span><br><span> </span><br><span> ../regen-makefile.sh $MAIN $FILES</span><br><span>diff --git a/library/RAN_Adapter.ttcn b/library/RAN_Adapter.ttcnpp</span><br><span>similarity index 98%</span><br><span>rename from library/RAN_Adapter.ttcn</span><br><span>rename to library/RAN_Adapter.ttcnpp</span><br><span>index 294f747..43b4988 100644</span><br><span>--- a/library/RAN_Adapter.ttcn</span><br><span>+++ b/library/RAN_Adapter.ttcnpp</span><br><span>@@ -88,6 +88,7 @@</span><br><span>               ba.vc_RAN := RAN_Emulation_CT.create(id & "-RAN");</span><br><span>     }</span><br><span>    select (cfg.transport) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span>         case (BSSAP_TRANSPORT_AoIP) {</span><br><span>                ba.vc_M3UA := M3UA_CT.create(id & "-M3UA");</span><br><span>            map(ba.vc_M3UA:SCTP_PORT, system:sctp);</span><br><span>@@ -128,6 +129,7 @@</span><br><span>                ba.vc_WAIT.done;</span><br><span>             disconnect(ba.vc_IPA:IPA_SP_PORT, ba.vc_WAIT:IPA_SP_PORT);</span><br><span>           }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>    case else {</span><br><span>          setverdict(fail, "Unsuppored RAN_Transport");</span><br><span>              mtc.stop;</span><br><span>@@ -139,8 +141,10 @@</span><br><span>             T.start;</span><br><span>             //T.timeout;</span><br><span>                 log("Connecting BSSMAP Emulation to SCCP_SP_PORT and starting emulation");</span><br><span style="color: hsl(120, 100%, 40%);">+#if RAN_EMULATION_BSSAP</span><br><span>                /* connect BSSNAP component to upper side of SCCP */</span><br><span>                 connect(ba.vc_RAN:BSSAP, ba.vc_SCCP:SCCP_SP_PORT);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>           if (cfg.transport == BSSAP_TRANSPORT_SCCPlite_SERVER or</span><br><span>                  cfg.transport == BSSAP_TRANSPORT_SCCPlite_CLIENT) {</span><br><span>                      /* connect IPA MGCP port with BSSMAP MGCP port */</span><br><span>diff --git a/library/RAN_Emulation.ttcn b/library/RAN_Emulation.ttcnpp</span><br><span>similarity index 92%</span><br><span>rename from library/RAN_Emulation.ttcn</span><br><span>rename to library/RAN_Emulation.ttcnpp</span><br><span>index 5a97a6e..21dbea9 100644</span><br><span>--- a/library/RAN_Emulation.ttcn</span><br><span>+++ b/library/RAN_Emulation.ttcnpp</span><br><span>@@ -22,7 +22,7 @@</span><br><span>  * Inbound Unit Data messages (such as are dispatched to the RanOps.unitdata_cb() callback,</span><br><span>  * which is registered with an argument to the main() function below.</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2017-2018 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017-2019 by Harald Welte <laforge@gnumonks.org></span><br><span>  * All rights reserved.</span><br><span>  *</span><br><span>  * Released under the terms of GNU General Public License, Version 2 or</span><br><span>@@ -34,13 +34,19 @@</span><br><span> import from Osmocom_Types all;</span><br><span> import from SCCP_Emulation all;</span><br><span> import from SCCPasp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MobileL3_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span> import from BSSAP_Types all;</span><br><span> import from BSSAP_CodecPort all;</span><br><span> import from BSSMAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_MGCP</span><br><span> import from MGCP_Types all;</span><br><span> import from MGCP_Templates all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from IPA_Emulation all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from MobileL3_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> /* General "base class" component definition, of which specific implementations</span><br><span>  * derive themselves by means of the "extends" feature */</span><br><span>@@ -61,12 +67,6 @@</span><br><span>  MSC_CONN_PRIM_CONF_IND</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-type record BSSAP_Conn_Req {</span><br><span style="color: hsl(0, 100%, 40%);">-     SCCP_PAR_Address        addr_peer,</span><br><span style="color: hsl(0, 100%, 40%);">-      SCCP_PAR_Address        addr_own,</span><br><span style="color: hsl(0, 100%, 40%);">-       PDU_BSSAP               bssap</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* similar to PDU_BSSAP with DTAP, but DTAP is already decoded! */</span><br><span> type record PDU_DTAP_MO {</span><br><span>    OCT1                    dlci optional,</span><br><span>@@ -102,23 +102,22 @@</span><br><span>       dtap := dtap</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template BSSAP_Conn_Req ts_BSSAP_Conn_Req(SCCP_PAR_Address peer, SCCP_PAR_Address own, PDU_BSSAP bssap) := {</span><br><span style="color: hsl(0, 100%, 40%);">-       addr_peer := peer,</span><br><span style="color: hsl(0, 100%, 40%);">-      addr_own := own,</span><br><span style="color: hsl(0, 100%, 40%);">-        bssap := bssap</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* port between individual per-connection components and this dispatcher */</span><br><span> type port RAN_Conn_PT message {</span><br><span style="color: hsl(0, 100%, 40%);">-              /* BSSAP or direct DTAP messages from/to clients */</span><br><span style="color: hsl(0, 100%, 40%);">-     inout   PDU_BSSAP, PDU_DTAP_MO, PDU_DTAP_MT,</span><br><span style="color: hsl(0, 100%, 40%);">-            /* misc indications / requests between SCCP and client */</span><br><span style="color: hsl(0, 100%, 40%);">-               RAN_Conn_Prim,</span><br><span style="color: hsl(120, 100%, 40%);">+        inout</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span style="color: hsl(120, 100%, 40%);">+             PDU_BSSAP,</span><br><span>           /* Client requests us to create SCCP Connection */</span><br><span>           BSSAP_Conn_Req,</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_MGCP</span><br><span>           /* MGCP, only used for IPA SCCPlite (MGCP in IPA mux) */</span><br><span style="color: hsl(0, 100%, 40%);">-                MgcpCommand, MgcpResponse;</span><br><span style="color: hsl(120, 100%, 40%);">+            MgcpCommand, MgcpResponse,</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+            /* direct DTAP messages from/to clients */</span><br><span style="color: hsl(120, 100%, 40%);">+            PDU_DTAP_MO, PDU_DTAP_MT,</span><br><span style="color: hsl(120, 100%, 40%);">+             /* misc indications / requests between SCCP and client */</span><br><span style="color: hsl(120, 100%, 40%);">+             RAN_Conn_Prim;</span><br><span> } with { extension "internal" };</span><br><span> </span><br><span> </span><br><span>@@ -127,8 +126,10 @@</span><br><span>  /* reference to the instance of the per-connection component */</span><br><span>      RAN_ConnHdlr    comp_ref,</span><br><span>    integer         sccp_conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_MGCP</span><br><span>     /* most recent MGCP transaction ID (Used on MSC side) */</span><br><span>     MgcpTransId     mgcp_trans_id optional,</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>      /* CIC that has been used for voice of this channel (BSC side) */</span><br><span>    integer         cic optional,</span><br><span>        /* array of N(SD) values for MO DTAP messages, indexed by discriminator */</span><br><span>@@ -142,12 +143,16 @@</span><br><span> }</span><br><span> </span><br><span> type component RAN_Emulation_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        /* SCCP port on the bottom side, using ASP primitives */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* SCCP ports on the bottom side, using ASP primitives */</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span>        port BSSAP_CODEC_PT BSSAP;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>   /* BSSAP port to the per-connection clients */</span><br><span>       port RAN_Conn_PT CLIENT;</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_MGCP</span><br><span>  /* MGCP port */</span><br><span>      port IPA_MGCP_PT MGCP;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span>   /* use 16 as this is also the number of SCCP connections that SCCP_Emulation can handle */</span><br><span>   var ConnectionData ConnectionTable[16];</span><br><span>@@ -212,6 +217,8 @@</span><br><span>        mtc.stop;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_MGCP</span><br><span> /* resolve component reference by CIC */</span><br><span> private function f_comp_by_mgcp_tid(MgcpTransId tid)</span><br><span> runs on RAN_Emulation_CT return RAN_ConnHdlr {</span><br><span>@@ -237,6 +244,7 @@</span><br><span>  setverdict(fail, "RAN Connection table not found by component ", client);</span><br><span>  mtc.stop;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> private function f_comp_by_cic(integer cic)</span><br><span> runs on RAN_Emulation_CT return RAN_ConnHdlr {</span><br><span>@@ -303,7 +311,9 @@</span><br><span>    for (var integer i := 0; i < sizeof(ConnectionTable); i := i+1) {</span><br><span>                 ConnectionTable[i].comp_ref := null;</span><br><span>                 ConnectionTable[i].sccp_conn_id := -1;</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_MGCP</span><br><span>            ConnectionTable[i].mgcp_trans_id := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>            ConnectionTable[i].cic := omit;</span><br><span>              ConnectionTable[i].n_sd := { 0, 0, 0, 0 };</span><br><span>   }</span><br><span>@@ -354,6 +364,18 @@</span><br><span>     return null;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span style="color: hsl(120, 100%, 40%);">+type record BSSAP_Conn_Req {</span><br><span style="color: hsl(120, 100%, 40%);">+       SCCP_PAR_Address        addr_peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    SCCP_PAR_Address        addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+     PDU_BSSAP               bssap</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template BSSAP_Conn_Req ts_BSSAP_Conn_Req(SCCP_PAR_Address peer, SCCP_PAR_Address own, PDU_BSSAP bssap) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        addr_peer := peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    addr_own := own,</span><br><span style="color: hsl(120, 100%, 40%);">+      bssap := bssap</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* handle (optional) userData portion of various primitives and dispatch it to the client */</span><br><span> private function f_handle_userData(RAN_ConnHdlr client, PDU_BSSAP bssap)</span><br><span> runs on RAN_Emulation_CT {</span><br><span>@@ -420,69 +442,6 @@</span><br><span>        return g_ran_ops.unitdata_cb.apply(bssap);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-type record RanOps {</span><br><span style="color: hsl(0, 100%, 40%);">- BssmapCreateCallback create_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- BssmapUnitdataCallback unitdata_cb,</span><br><span style="color: hsl(0, 100%, 40%);">-     boolean decode_dtap,</span><br><span style="color: hsl(0, 100%, 40%);">-    boolean role_ms,</span><br><span style="color: hsl(0, 100%, 40%);">-        /* needed for performing BSSMAP RESET */</span><br><span style="color: hsl(0, 100%, 40%);">-        SCCP_PAR_Address sccp_addr_local optional,</span><br><span style="color: hsl(0, 100%, 40%);">-      SCCP_PAR_Address sccp_addr_peer optional</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-template BIT4 t_ML3_DISC_CC_MM_SS := ('0011'B, '0101'B, '1011'B);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* patch N(SD) into enc_l3, according to 24.007 11.2.3.2 */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_ML3_patch_seq(inout ConnectionData cd, in PDU_ML3_MS_NW dtap, inout octetstring enc_l3) {</span><br><span style="color: hsl(0, 100%, 40%);">-       var uint2_t seq_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-     if (ischosen(dtap.msgs.cc) or ischosen(dtap.msgs.mm) or ischosen(dtap.msgs.ss)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               seq_nr := cd.n_sd[0];</span><br><span style="color: hsl(0, 100%, 40%);">-           cd.n_sd[0] := (cd.n_sd[0] + 1) mod 4;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else if (ischosen(dtap.msgs.gcc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           seq_nr := cd.n_sd[1];</span><br><span style="color: hsl(0, 100%, 40%);">-           cd.n_sd[1] := (cd.n_sd[1] + 1) mod 2;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else if (ischosen(dtap.msgs.bcc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           seq_nr := cd.n_sd[2];</span><br><span style="color: hsl(0, 100%, 40%);">-           cd.n_sd[2] := (cd.n_sd[2] + 1) mod 2;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else if (ischosen(dtap.msgs.loc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           seq_nr := cd.n_sd[3];</span><br><span style="color: hsl(0, 100%, 40%);">-           cd.n_sd[3] := (cd.n_sd[3] + 1) mod 2;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* no sequence number to patch */</span><br><span style="color: hsl(0, 100%, 40%);">-               return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       log("patching N(SD)=", seq_nr, " into dtap ", enc_l3);</span><br><span style="color: hsl(0, 100%, 40%);">-      enc_l3[1] := (enc_l3[1] and4b '3f'O) or4b bit2oct(int2bit(seq_nr, 8) << 6);</span><br><span style="color: hsl(0, 100%, 40%);">-       log("patched enc_l3: ", enc_l3);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_bssap_l3_is_rr(PDU_BSSAP bssap) return boolean {</span><br><span style="color: hsl(0, 100%, 40%);">-  var template octetstring l3 := f_bssap_extract_l3(bssap);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (not isvalue(l3)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       var octetstring l3v := valueof(l3);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (lengthof(l3v) < 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* lower 4 bits of first octet are protocol discriminator */</span><br><span style="color: hsl(0, 100%, 40%);">-    if ((oct2bit(l3v[0]) and4b '00001111'B) == '00000110'B) {</span><br><span style="color: hsl(0, 100%, 40%);">-               return true;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       return false;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private altstep as_reset_ack() runs on RAN_Emulation_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var BSSAP_N_UNITDATA_ind ud_ind;</span><br><span style="color: hsl(0, 100%, 40%);">-        [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {</span><br><span style="color: hsl(0, 100%, 40%);">-             log("Respoding to inbound RESET with RESET-ACK");</span><br><span style="color: hsl(0, 100%, 40%);">-             BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-                      ts_BSSMAP_ResetAck));</span><br><span style="color: hsl(0, 100%, 40%);">-                repeat;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> private function f_bssap_wait_for_reset() runs on RAN_Emulation_CT {</span><br><span>   var BSSAP_N_UNITDATA_ind ud_ind;</span><br><span>     timer T := 20.0;</span><br><span>@@ -522,37 +481,98 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function main(RanOps ops, charstring id) runs on RAN_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_bssap_l3_is_rr(PDU_BSSAP bssap) return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+    var template octetstring l3 := f_bssap_extract_l3(bssap);</span><br><span style="color: hsl(120, 100%, 40%);">+     return f_L3_is_rr(l3);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   g_ran_id := id;</span><br><span style="color: hsl(0, 100%, 40%);">- g_ran_ops := ops;</span><br><span style="color: hsl(0, 100%, 40%);">-       f_conn_table_init();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_expect_table_init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (isvalue(ops.sccp_addr_peer) and isvalue(ops.sccp_addr_local)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             f_sleep(1.0);   /* HACK to wait for M3UA/ASP to be ACTIVE */</span><br><span style="color: hsl(0, 100%, 40%);">-            f_bssap_reset(ops.sccp_addr_peer, ops.sccp_addr_local);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated RanProtocol {</span><br><span style="color: hsl(120, 100%, 40%);">+      RAN_PROTOCOL_BSSAP</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%);">+type record RanOps {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span style="color: hsl(120, 100%, 40%);">+     BssmapCreateCallback create_cb optional,</span><br><span style="color: hsl(120, 100%, 40%);">+      BssmapUnitdataCallback unitdata_cb optional,</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+  boolean decode_dtap,</span><br><span style="color: hsl(120, 100%, 40%);">+  boolean role_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+      RanProtocol protocol,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* needed for performing BSSMAP RESET */</span><br><span style="color: hsl(120, 100%, 40%);">+      SCCP_PAR_Address sccp_addr_local optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    SCCP_PAR_Address sccp_addr_peer optional</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%);">+template BIT4 t_ML3_DISC_CC_MM_SS := ('0011'B, '0101'B, '1011'B);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_L3_is_rr(template octetstring l3) return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not isvalue(l3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return false;</span><br><span>        }</span><br><span style="color: hsl(120, 100%, 40%);">+     var octetstring l3v := valueof(l3);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (lengthof(l3v) < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* lower 4 bits of first octet are protocol discriminator */</span><br><span style="color: hsl(120, 100%, 40%);">+  if ((oct2bit(l3v[0]) and4b '00001111'B) == '00000110'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+             return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     return false;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+/* patch N(SD) into enc_l3, according to 24.007 11.2.3.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ML3_patch_seq(inout ConnectionData cd, in PDU_ML3_MS_NW dtap, inout octetstring enc_l3) {</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint2_t seq_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ischosen(dtap.msgs.cc) or ischosen(dtap.msgs.mm) or ischosen(dtap.msgs.ss)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             seq_nr := cd.n_sd[0];</span><br><span style="color: hsl(120, 100%, 40%);">+         cd.n_sd[0] := (cd.n_sd[0] + 1) mod 4;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(dtap.msgs.gcc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         seq_nr := cd.n_sd[1];</span><br><span style="color: hsl(120, 100%, 40%);">+         cd.n_sd[1] := (cd.n_sd[1] + 1) mod 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(dtap.msgs.bcc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         seq_nr := cd.n_sd[2];</span><br><span style="color: hsl(120, 100%, 40%);">+         cd.n_sd[2] := (cd.n_sd[2] + 1) mod 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(dtap.msgs.loc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         seq_nr := cd.n_sd[3];</span><br><span style="color: hsl(120, 100%, 40%);">+         cd.n_sd[3] := (cd.n_sd[3] + 1) mod 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* no sequence number to patch */</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("patching N(SD)=", seq_nr, " into dtap ", enc_l3);</span><br><span style="color: hsl(120, 100%, 40%);">+    enc_l3[1] := (enc_l3[1] and4b '3f'O) or4b bit2oct(int2bit(seq_nr, 8) << 6);</span><br><span style="color: hsl(120, 100%, 40%);">+     log("patched enc_l3: ", enc_l3);</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%);">+private altstep as_reset_ack() runs on RAN_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSAP_N_UNITDATA_ind ud_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+           log("Respoding to inbound RESET with RESET-ACK");</span><br><span style="color: hsl(120, 100%, 40%);">+           BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,</span><br><span style="color: hsl(120, 100%, 40%);">+                    ts_BSSMAP_ResetAck));</span><br><span style="color: hsl(120, 100%, 40%);">+              repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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%);">+private altstep as_main_bssap() runs on RAN_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span>             var BSSAP_N_UNITDATA_ind ud_ind;</span><br><span>             var BSSAP_N_CONNECT_ind conn_ind;</span><br><span>            var BSSAP_N_CONNECT_cfm conn_cfm;</span><br><span>            var BSSAP_N_DATA_ind data_ind;</span><br><span>               var BSSAP_N_DISCONNECT_ind disc_ind;</span><br><span>                 var BSSAP_Conn_Req creq;</span><br><span style="color: hsl(0, 100%, 40%);">-                var RAN_ConnHdlr vc_conn;</span><br><span>            var PDU_BSSAP bssap;</span><br><span style="color: hsl(0, 100%, 40%);">-            var PDU_DTAP_MO dtap_mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                var PDU_DTAP_MT dtap_mt;</span><br><span style="color: hsl(0, 100%, 40%);">-                var MgcpCommand mgcp_req;</span><br><span style="color: hsl(0, 100%, 40%);">-               var MgcpResponse mgcp_resp;</span><br><span style="color: hsl(0, 100%, 40%);">-             var RAN_ConnHdlr vc_hdlr;</span><br><span style="color: hsl(0, 100%, 40%);">-               var octetstring l3_info;</span><br><span style="color: hsl(0, 100%, 40%);">-                var hexstring imsi;</span><br><span style="color: hsl(0, 100%, 40%);">-             var OCT4 tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+                var RAN_ConnHdlr vc_conn;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           alt {</span><br><span>                /* SCCP -> Client: UNIT-DATA (connectionless SCCP) from a BSC */</span><br><span>          [] BSSAP.receive(BSSAP_N_UNITDATA_ind:?) -> value ud_ind {</span><br><span>                        /* Connectionless Procedures like RESET */</span><br><span>@@ -563,10 +583,9 @@</span><br><span>                                                            ud_ind.calledAddress, resp));</span><br><span>                        }</span><br><span>                    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>            /* SCCP -> Client: new connection from BSC */</span><br><span>             [] BSSAP.receive(BSSAP_N_CONNECT_ind:?) -> value conn_ind {</span><br><span style="color: hsl(0, 100%, 40%);">-                  vc_conn := ops.create_cb.apply(conn_ind, id);</span><br><span style="color: hsl(120, 100%, 40%);">+                 vc_conn := g_ran_ops.create_cb.apply(conn_ind, g_ran_id);</span><br><span>                    /* store mapping between client components and SCCP connectionId */</span><br><span>                  f_conn_table_add(vc_conn, conn_ind.connectionId);</span><br><span>                    /* handle user payload */</span><br><span>@@ -574,7 +593,6 @@</span><br><span>                      /* confirm connection establishment */</span><br><span>                       BSSAP.send(ts_BSSAP_CONNECT_res(conn_ind.connectionId, omit));</span><br><span>                       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>            /* SCCP -> Client: connection-oriented data in existing connection */</span><br><span>             [] BSSAP.receive(BSSAP_N_DATA_ind:?) -> value data_ind {</span><br><span>                  vc_conn := f_comp_by_conn_id(data_ind.connectionId);</span><br><span>@@ -582,7 +600,6 @@</span><br><span>                           f_handle_userData(vc_conn, data_ind.userData);</span><br><span>                       }</span><br><span>                    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>            /* SCCP -> Client: disconnect of an existing connection */</span><br><span>                [] BSSAP.receive(BSSAP_N_DISCONNECT_ind:?) -> value disc_ind {</span><br><span>                    vc_conn := f_comp_by_conn_id(disc_ind.connectionId);</span><br><span>@@ -595,7 +612,6 @@</span><br><span>                   f_conn_table_del(disc_ind.connectionId);</span><br><span>                     /* TOOD: return confirm to other side? */</span><br><span>                    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>            /* SCCP -> Client: connection confirm for outbound connection */</span><br><span>          [] BSSAP.receive(BSSAP_N_CONNECT_cfm:?) -> value conn_cfm {</span><br><span>                       vc_conn := f_comp_by_conn_id(conn_cfm.connectionId);</span><br><span>@@ -606,6 +622,11 @@</span><br><span>                          f_handle_userData(vc_conn, conn_cfm.userData);</span><br><span>                       }</span><br><span>                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] CLIENT.receive(PDU_BSSAP:?) -> value bssap sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+                     var integer conn_id := f_conn_id_by_comp(vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* send it to dispatcher */</span><br><span style="color: hsl(120, 100%, 40%);">+                   BSSAP.send(ts_BSSAP_DATA_req(conn_id, bssap));</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span> </span><br><span>                /* Disconnect request client -> SCCP */</span><br><span>           [] CLIENT.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ) -> sender vc_conn {</span><br><span>@@ -644,33 +665,16 @@</span><br><span>                       }</span><br><span> </span><br><span>                        }</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+              [false] CLIENT.receive(false) {}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         [] CLIENT.receive(PDU_BSSAP:?) -> value bssap sender vc_conn {</span><br><span style="color: hsl(0, 100%, 40%);">-                       var integer conn_id := f_conn_id_by_comp(vc_conn);</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* send it to dispatcher */</span><br><span style="color: hsl(0, 100%, 40%);">-                     BSSAP.send(ts_BSSAP_DATA_req(conn_id, bssap));</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               [g_ran_ops.role_ms] CLIENT.receive(PDU_DTAP_MO:?) -> value dtap_mo sender vc_conn {</span><br><span style="color: hsl(0, 100%, 40%);">-                  var integer idx := f_idx_by_comp(vc_conn);</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* convert from decoded DTAP to encoded DTAP */</span><br><span style="color: hsl(0, 100%, 40%);">-                 var octetstring l3_enc := enc_PDU_ML3_MS_NW(dtap_mo.dtap);</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* patch correct L3 send sequence number N(SD) into l3_enc */</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (dtap_mo.skip_seq_patching == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               f_ML3_patch_seq(ConnectionTable[idx], dtap_mo.dtap, l3_enc);</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       bssap := valueof(ts_BSSAP_DTAP(l3_enc, dtap_mo.dlci));</span><br><span style="color: hsl(0, 100%, 40%);">-                  BSSAP.send(ts_BSSAP_DATA_req(ConnectionTable[idx].sccp_conn_id, bssap));</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               [not g_ran_ops.role_ms] CLIENT.receive(PDU_DTAP_MT:?) -> value dtap_mt sender vc_conn {</span><br><span style="color: hsl(0, 100%, 40%);">-                      var integer conn_id := f_conn_id_by_comp(vc_conn);</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* convert from decoded DTAP to encoded DTAP */</span><br><span style="color: hsl(0, 100%, 40%);">-                 var octetstring l3_enc := enc_PDU_ML3_NW_MS(dtap_mt.dtap);</span><br><span style="color: hsl(0, 100%, 40%);">-                      bssap := valueof(ts_BSSAP_DTAP(l3_enc, dtap_mo.dlci));</span><br><span style="color: hsl(0, 100%, 40%);">-                  BSSAP.send(ts_BSSAP_DATA_req(conn_id, bssap));</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_main_mgcp() runs on RAN_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_MGCP</span><br><span style="color: hsl(120, 100%, 40%);">+               var MgcpCommand mgcp_req;</span><br><span style="color: hsl(120, 100%, 40%);">+             var MgcpResponse mgcp_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+           var RAN_ConnHdlr vc_conn;</span><br><span> </span><br><span>                /* Handling of MGCP in IPA SCCPLite case.  This predates 3GPP AoIP</span><br><span>            * and uses a MGCP session in parallel to BSSAP.  BSSAP uses CIC</span><br><span>@@ -710,7 +714,68 @@</span><br><span>                      vc_conn := f_comp_by_mgcp_tid(mgcp_resp.line.trans_id);</span><br><span>                      CLIENT.send(mgcp_resp) to vc_conn;</span><br><span>                   }</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+              [false] CLIENT.receive {}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* send a raw (encoded) L3 message over given SCCP connection */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_xmit_raw_l3(integer sccp_conn_id, OCT1 dlci, octetstring l3_enc) runs on RAN_Emulation_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   select (g_ran_ops.protocol) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_BSSAP</span><br><span style="color: hsl(120, 100%, 40%);">+     case (RAN_PROTOCOL_BSSAP) {</span><br><span style="color: hsl(120, 100%, 40%);">+           var PDU_BSSAP bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+          bssap := valueof(ts_BSSAP_DTAP(l3_enc, dlci));</span><br><span style="color: hsl(120, 100%, 40%);">+                BSSAP.send(ts_BSSAP_DATA_req(sccp_conn_id, bssap));</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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%);">+function main(RanOps ops, charstring id) runs on RAN_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ g_ran_id := id;</span><br><span style="color: hsl(120, 100%, 40%);">+       g_ran_ops := ops;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_conn_table_init();</span><br><span style="color: hsl(120, 100%, 40%);">+  f_expect_table_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (isvalue(ops.sccp_addr_peer) and isvalue(ops.sccp_addr_local)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_sleep(1.0);   /* HACK to wait for M3UA/ASP to be ACTIVE */</span><br><span style="color: hsl(120, 100%, 40%);">+          f_bssap_reset(ops.sccp_addr_peer, ops.sccp_addr_local);</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%);">+   while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var RAN_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+             var PDU_DTAP_MO dtap_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+              var PDU_DTAP_MT dtap_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+              var RAN_ConnHdlr vc_hdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+             var octetstring l3_info;</span><br><span style="color: hsl(120, 100%, 40%);">+              var hexstring imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+           var OCT4 tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [g_ran_ops.protocol == RAN_PROTOCOL_BSSAP] as_main_bssap();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         [g_ran_ops.role_ms] CLIENT.receive(PDU_DTAP_MO:?) -> value dtap_mo sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+                        var integer idx := f_idx_by_comp(vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* convert from decoded DTAP to encoded DTAP */</span><br><span style="color: hsl(120, 100%, 40%);">+                       var octetstring l3_enc := enc_PDU_ML3_MS_NW(dtap_mo.dtap);</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* patch correct L3 send sequence number N(SD) into l3_enc */</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (dtap_mo.skip_seq_patching == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             f_ML3_patch_seq(ConnectionTable[idx], dtap_mo.dtap, l3_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_xmit_raw_l3(ConnectionTable[idx].sccp_conn_id, dtap_mo.dlci, l3_enc);</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%);">+           [not g_ran_ops.role_ms] CLIENT.receive(PDU_DTAP_MT:?) -> value dtap_mt sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+                    var integer idx := f_idx_by_comp(vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* convert from decoded DTAP to encoded DTAP */</span><br><span style="color: hsl(120, 100%, 40%);">+                       var octetstring l3_enc := enc_PDU_ML3_NW_MS(dtap_mt.dtap);</span><br><span style="color: hsl(120, 100%, 40%);">+                    f_xmit_raw_l3(ConnectionTable[idx].sccp_conn_id, dtap_mt.dlci, l3_enc);</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%);">+           [] as_main_mgcp();</span><br><span> </span><br><span>               [] PROC.getcall(RAN_register:{?,?}) -> param(l3_info, vc_hdlr) {</span><br><span>                  f_create_expect(l3_info, vc_hdlr);</span><br><span>@@ -727,11 +792,13 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef RAN_EMULATION_MGCP</span><br><span> private function f_mgcp_ep_extract_cic(charstring inp) return integer {</span><br><span>     var charstring local_part := regexp(inp, "(*)@*", 0);</span><br><span>      return hex2int(str2hex(local_part));</span><br><span> </span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> /***********************************************************************</span><br><span>  * "Expect" Handling (mapping for expected incoming SCCP connections)</span><br><span>diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn</span><br><span>index 00e86f1..730e57c 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -178,6 +178,7 @@</span><br><span>  unitdata_cb := refers(BscUnitdataCallback),</span><br><span>  decode_dtap := true,</span><br><span>         role_ms := true,</span><br><span style="color: hsl(120, 100%, 40%);">+      protocol := RAN_PROTOCOL_BSSAP,</span><br><span>      sccp_addr_local := omit,</span><br><span>     sccp_addr_peer := omit</span><br><span> }</span><br><span>diff --git a/msc/gen_links.sh b/msc/gen_links.sh</span><br><span>index a29118a..e4e142b 100755</span><br><span>--- a/msc/gen_links.sh</span><br><span>+++ b/msc/gen_links.sh</span><br><span>@@ -89,7 +89,7 @@</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> FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn L3_Templates.ttcn L3_Common.ttcn "</span><br><span style="color: hsl(0, 100%, 40%);">-FILES+="RAN_Emulation.ttcn BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn RAN_Adapter.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_Emulation.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="RAN_Emulation.ttcnpp BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn RAN_Adapter.ttcnpp MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_Emulation.ttcn "</span><br><span> FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc "</span><br><span> FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc "</span><br><span> FILES+="SMPP_CodecPort.ttcn SMPP_CodecPort_CtrlFunct.ttcn SMPP_CodecPort_CtrlFunctDef.cc SMPP_Emulation.ttcn SMPP_Templates.ttcn "</span><br><span>diff --git a/msc/regen_makefile.sh b/msc/regen_makefile.sh</span><br><span>index 5645fdd..091faf8 100755</span><br><span>--- a/msc/regen_makefile.sh</span><br><span>+++ b/msc/regen_makefile.sh</span><br><span>@@ -2,6 +2,6 @@</span><br><span> </span><br><span> 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> </span><br><span style="color: hsl(0, 100%, 40%);">-export CPPFLAGS_TTCN3="-DIPA_EMULATION_MGCP -DIPA_EMULATION_GSUP -DIPA_EMULATION_SCCP -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 -DUSE_MTP3_DISTRIBUTOR"</span><br><span> </span><br><span> ../regen-makefile.sh MSC_Tests.ttcn $FILES</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13651">change 13651</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/13651"/><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: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Id53ba3ff05f9946230e0e4a759245de14a0f9fbd </div>
<div style="display:none"> Gerrit-Change-Number: 13651 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>