<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13651">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Harald Welte: Looks good to me, approved
Jenkins Builder: Verified
</div><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;"><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 72e2733..e091133 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 e408f82..11baf2a 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -180,6 +180,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: merged </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: 5 </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>