<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15207">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  pespin: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mme: Integrate DIAMETER support into MME testsuite<br><br>The test suite can now send/receive DIAMETER messages via related test<br>ports.<br><br>Change-Id: I1691f87e19cced79ab0f9c3bb87608fc63e21eab<br>---<br>M mme/MME_Tests.ttcn<br>M mme/gen_links.sh<br>M mme/regen_makefile.sh<br>3 files changed, 115 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/mme/MME_Tests.ttcn b/mme/MME_Tests.ttcn</span><br><span>index ae71173..da45485 100644</span><br><span>--- a/mme/MME_Tests.ttcn</span><br><span>+++ b/mme/MME_Tests.ttcn</span><br><span>@@ -21,6 +21,10 @@</span><br><span> import from NAS_EPS_Types all;</span><br><span> import from NAS_Templates all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from DIAMETER_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DIAMETER_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DIAMETER_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> import from SGsAP_Types all;</span><br><span> import from SGsAP_Templates all;</span><br><span> import from SGsAP_Emulation all;</span><br><span>@@ -58,6 +62,11 @@</span><br><span>        port S1AP_PT S1AP_UNIT[NUM_ENB];</span><br><span>     port S1APEM_PROC_PT S1AP_PROC[NUM_ENB];</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* S6a/S6d interface of emulated HSS */</span><br><span style="color: hsl(120, 100%, 40%);">+       var DIAMETER_Emulation_CT vc_DIAMETER;</span><br><span style="color: hsl(120, 100%, 40%);">+        port DIAMETER_PT DIAMETER_UNIT;</span><br><span style="color: hsl(120, 100%, 40%);">+       port DIAMETEREM_PROC_PT DIAMETER_PROC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* SGs interface of emulated MSC/VLR */</span><br><span>      var SGsAP_Emulation_CT vc_SGsAP;</span><br><span>     port SGsAP_PT SGsAP_UNIT;</span><br><span>@@ -66,7 +75,7 @@</span><br><span>        var UeParams g_ue_pars[NUM_UE];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-type component ConnHdlr extends S1AP_ConnHdlr, SGsAP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+type component ConnHdlr extends S1AP_ConnHdlr, SGsAP_ConnHdlr, DIAMETER_ConnHdlr {</span><br><span>  var ConnHdlrPars g_pars;</span><br><span>     timer g_Tguard := 30.0;</span><br><span> }</span><br><span>@@ -87,6 +96,10 @@</span><br><span>    charstring mp_s1_local_ip := "127.0.0.1";</span><br><span>  integer mp_s1_local_port := 50000;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* S6 interface */</span><br><span style="color: hsl(120, 100%, 40%);">+    charstring mp_s6_local_ip := "127.0.0.4";</span><br><span style="color: hsl(120, 100%, 40%);">+   integer mp_s6_local_port := 3868;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* SGs interface */</span><br><span>  charstring mp_sgs_local_ip := "127.0.0.1";</span><br><span>         integer mp_sgs_local_port := 29118;</span><br><span>@@ -191,6 +204,30 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+friend function DiameterForwardUnitdataCallback(PDU_DIAMETER msg)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on DIAMETER_Emulation_CT return template PDU_DIAMETER {</span><br><span style="color: hsl(120, 100%, 40%);">+   DIAMETER_UNIT.send(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      return omit;</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%);">+friend function f_init_diameter(charstring id) runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var DIAMETEROps ops := {</span><br><span style="color: hsl(120, 100%, 40%);">+              create_cb := refers(DIAMETER_Emulation.ExpectedCreateCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+               unitdata_cb := refers(DiameterForwardUnitdataCallback)</span><br><span style="color: hsl(120, 100%, 40%);">+        };</span><br><span style="color: hsl(120, 100%, 40%);">+    var DIAMETER_conn_parameters pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+                remote_ip := mp_mme_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+               remote_sctp_port := -1,</span><br><span style="color: hsl(120, 100%, 40%);">+               local_ip := mp_s6_local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+           local_sctp_port := mp_s6_local_port</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_DIAMETER := DIAMETER_Emulation_CT.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+      map(vc_DIAMETER:DIAMETER, system:DIAMETER_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+  connect(vc_DIAMETER:DIAMETER_UNIT, self:DIAMETER_UNIT);</span><br><span style="color: hsl(120, 100%, 40%);">+       connect(vc_DIAMETER:DIAMETER_PROC, self:DIAMETER_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_DIAMETER.start(DIAMETER_Emulation.main(ops, pars, id));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> friend template (value) TAI ts_enb_S1AP_TAI(EnbParams enb) := {</span><br><span>   pLMNidentity := enb.global_enb_id.pLMNidentity,</span><br><span>      tAC := enb.supported_tas[0].tAC,</span><br><span>@@ -232,6 +269,10 @@</span><br><span>              connect(vc_conn:SGsAP, vc_SGsAP:SGsAP_CLIENT);</span><br><span>               connect(vc_conn:SGsAP_PROC, vc_SGsAP:SGsAP_PROC);</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (isbound(vc_DIAMETER)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           connect(vc_conn:DIAMETER, vc_DIAMETER:DIAMETER_CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+               connect(vc_conn:DIAMETER_PROC, vc_DIAMETER:DIAMETER_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span> </span><br><span>        /* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have</span><br><span>       * a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */</span><br><span>@@ -253,6 +294,9 @@</span><br><span>         /* start guard timre and activate it as default */</span><br><span>   g_Tguard.start(t_guard);</span><br><span>     activate(as_Tguard());</span><br><span style="color: hsl(120, 100%, 40%);">+        if (DIAMETER_PROC.checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                f_diameter_expect(g_pars.ue_pars.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    if (SGsAP_PROC.checkstate("Connected")) {</span><br><span>          /* Route all SGsAP mesages for our IMSIto us */</span><br><span>              f_create_sgsap_expect(pars.ue_pars.imsi);</span><br><span>@@ -414,9 +458,64 @@</span><br><span>             }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Exepect AuthInfoReq (AIR) from HSS; respond with AuthInforAnswer (AIA) */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_DIA_AuthInfo() runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_DIAMETER rx_dia;</span><br><span style="color: hsl(120, 100%, 40%);">+      [] DIAMETER.receive(tr_DIA_AIR(g_pars.ue_pars.imsi)) -> value rx_dia {</span><br><span style="color: hsl(120, 100%, 40%);">+             var template (omit) AVP avp;</span><br><span style="color: hsl(120, 100%, 40%);">+          var octetstring sess_id;</span><br><span style="color: hsl(120, 100%, 40%);">+              var octetstring vplmn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+             var hexstring imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+           var template (value) AVP_list auth_info_content;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* retrieve input data */</span><br><span style="color: hsl(120, 100%, 40%);">+             imsi := valueof(f_DIAMETER_get_imsi(rx_dia));</span><br><span style="color: hsl(120, 100%, 40%);">+         avp := f_DIAMETER_get_avp(rx_dia, c_AVP_Code_BASE_NONE_Session_Id);</span><br><span style="color: hsl(120, 100%, 40%);">+           sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);</span><br><span style="color: hsl(120, 100%, 40%);">+            avp := f_DIAMETER_get_avp(rx_dia, c_AVP_Code_AAA_3GPP_Visited_PLMN_Id);</span><br><span style="color: hsl(120, 100%, 40%);">+               vplmn_id := valueof(avp.avp_data.avp_AAA_3GPP_Visited_PLMN_Id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             /* compute tuple */</span><br><span style="color: hsl(120, 100%, 40%);">+           auth_info_content := { ts_AVP_EutranVec(1, '20080c3818183b522614162c07601d0d'O, '6a91970e838fd079'O, 'f11b89a2a8be00001f9c526f3d75d44c'O, '95AFAD9A0D29AFAA079A9451DF7161D7EE4CBF2AF9387F766D058BB6B44B905D'O) };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           DIAMETER.send(ts_DIA_AIA(rx_dia.hop_by_hop_id, rx_dia.end_to_end_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   sess_id, auth_info_content));</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%);">+/* Expect UpdateLocationReq (ULR); respond with UpdateLocationAnswer (ULA) */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_DIA_UpdLoc() runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     var PDU_DIAMETER rx_dia;</span><br><span style="color: hsl(120, 100%, 40%);">+      [] DIAMETER.receive(tr_DIA_ULR(g_pars.ue_pars.imsi)) -> value rx_dia {</span><br><span style="color: hsl(120, 100%, 40%);">+             var template (omit) AVP avp;</span><br><span style="color: hsl(120, 100%, 40%);">+          var octetstring sess_id;</span><br><span style="color: hsl(120, 100%, 40%);">+              var hexstring imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+           var template (value) AVP_list sub_data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             /* retrieve input data */</span><br><span style="color: hsl(120, 100%, 40%);">+             imsi := valueof(f_DIAMETER_get_imsi(rx_dia));</span><br><span style="color: hsl(120, 100%, 40%);">+         avp := f_DIAMETER_get_avp(rx_dia, c_AVP_Code_BASE_NONE_Session_Id);</span><br><span style="color: hsl(120, 100%, 40%);">+           sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          sub_data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 ts_AVP_3GPP_SubscriberStatus(SERVICE_GRANTED),</span><br><span style="color: hsl(120, 100%, 40%);">+                        ts_AVP_3GPP_SubscrRauTauTmr(30),</span><br><span style="color: hsl(120, 100%, 40%);">+                      ts_AVP_3GPP_AMBR(1000, 2000),</span><br><span style="color: hsl(120, 100%, 40%);">+                 ts_AVP_3GPP_ApnConfigProfile({</span><br><span style="color: hsl(120, 100%, 40%);">+                                ts_AVP_3GPP_ContextId(1),</span><br><span style="color: hsl(120, 100%, 40%);">+                             ts_AVP_3GPP_AllApnConfigsIncl,</span><br><span style="color: hsl(120, 100%, 40%);">+                                ts_AVP_3GPP_ApnConfig(1, IPv4, "*")</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%);">+          DIAMETER.send(ts_DIA_ULA(rx_dia.hop_by_hop_id, rx_dia.end_to_end_id, sess_id, sub_data));</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> private function f_TC_attach(ConnHdlrPars pars) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       f_init_handler(pars);</span><br><span style="color: hsl(0, 100%, 40%);">-   var template (value) EPS_MobileIdentityV mi := ts_NAS_MobileId_IMSI('001010000000001'H);</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (value) EPS_MobileIdentityV mi := ts_NAS_MobileId_IMSI(pars.ue_pars.imsi);</span><br><span>      var template (value) PDU_NAS_EPS nas_esm, nas_emm;</span><br><span> /*</span><br><span>     nas_esm := ts_NAS_ActDefEpsBearCtxReq(bearer_id := '0000'B, proc_tid := int2bit(1,8),</span><br><span>@@ -435,14 +534,24 @@</span><br><span>                                p_rrcCause := mo_Signalling);</span><br><span>        S1AP.send(tx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    as_DIA_AuthInfo();</span><br><span>   as_s1ap_handle_auth();</span><br><span style="color: hsl(0, 100%, 40%);">-  as_s1ap_handle_sec_mode();</span><br><span style="color: hsl(120, 100%, 40%);">+    alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_DIA_UpdLoc() {</span><br><span style="color: hsl(120, 100%, 40%);">+          as_s1ap_handle_sec_mode();</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_s1ap_handle_sec_mode() {</span><br><span style="color: hsl(120, 100%, 40%);">+                as_DIA_UpdLoc();</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        f_sleep(10.0);</span><br><span> }</span><br><span> testcase TC_s1ap_attach() runs on MTC_CT {</span><br><span>    var charstring id := testcasename();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_diameter(id);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(10.0);</span><br><span>       f_init_s1ap(id, 4);</span><br><span>  f_s1ap_setup(0);</span><br><span> </span><br><span>@@ -456,6 +565,7 @@</span><br><span>   execute( TC_s1ap_setup_wrong_plmn() );</span><br><span>       execute( TC_s1ap_setup_wrong_tac() );</span><br><span>        execute( TC_s1ap_setup() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_s1ap_attach() );</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/mme/gen_links.sh b/mme/gen_links.sh</span><br><span>index 5664711..b59410b 100755</span><br><span>--- a/mme/gen_links.sh</span><br><span>+++ b/mme/gen_links.sh</span><br><span>@@ -55,6 +55,7 @@</span><br><span> FILES+="L3_Templates.ttcn "</span><br><span> FILES+="S1AP_CodecPort.ttcn S1AP_CodecPort_CtrlFunctDef.cc S1AP_CodecPort_CtrlFunct.ttcn S1AP_Emulation.ttcn "</span><br><span> FILES+="NAS_Templates.ttcn GTPv2_PrivateExtensions.ttcn GTPv2_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="DIAMETER_Types.ttcn DIAMETER_CodecPort.ttcn DIAMETER_CodecPort_CtrlFunct.ttcn DIAMETER_CodecPort_CtrlFunctDef.cc DIAMETER_Emulation.ttcn DIAMETER_Templates.ttcn "</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> ignore_pp_results</span><br><span>diff --git a/mme/regen_makefile.sh b/mme/regen_makefile.sh</span><br><span>index 9fb5f88..2d3bf59 100755</span><br><span>--- a/mme/regen_makefile.sh</span><br><span>+++ b/mme/regen_makefile.sh</span><br><span>@@ -1,6 +1,6 @@</span><br><span> #!/bin/sh</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-FILES="*.ttcn *.asn *.c IPL4asp_PT.cc  IPL4asp_discovery.cc  Native_FunctionDefs.cc SGsAP_CodecPort_CtrlFunctDef.cc  S1AP_CodecPort_CtrlFunctDef.cc  TCCConversion.cc  TCCEncoding.cc  TCCInterface.cc  TELNETasp_PT.cc S1AP_EncDec.cc LTE_CryptoFunctionDefs.cc GTPU_EncDec.cc GTPC_EncDec.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn *.asn *.c IPL4asp_PT.cc  IPL4asp_discovery.cc  Native_FunctionDefs.cc SGsAP_CodecPort_CtrlFunctDef.cc  S1AP_CodecPort_CtrlFunctDef.cc  TCCConversion.cc  TCCEncoding.cc TCCInterface.cc  TELNETasp_PT.cc S1AP_EncDec.cc LTE_CryptoFunctionDefs.cc GTPU_EncDec.cc GTPC_EncDec.cc DIAMETER_EncDec.cc DIAMETER_CodecPort_CtrlFunctDef.cc "</span><br><span> </span><br><span> export CPPFLAGS_TTCN3=""</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15207">change 15207</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/c/osmo-ttcn3-hacks/+/15207"/><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-Change-Id: I1691f87e19cced79ab0f9c3bb87608fc63e21eab </div>
<div style="display:none"> Gerrit-Change-Number: 15207 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>