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