/** * @author ETSI / STF519 * @version $URL$ * $Id$ * @desc This module provides functions used in S1AP. * @copyright ETSI Copyright Notification * No part may be reproduced except as authorized by written permission. * The copyright and the foregoing restriction extend to reproduction in all media. * All rights reserved. * @see ETSI TS 136 413 / 3GPP TS 36.413 version 13.4.0 Release 13 */ module LibS1AP_Steps { // LibCommon import from LibCommon_Sync all; import from LibCommon_VerdictControl all; import from LibCommon_BasicTypesAndValues all; // LibS1AP import from S1AP_PDU_Descriptions language "ASN.1:1997" all; import from LibS1AP_TypesAndValues all; import from LibS1AP_Interface all; import from LibS1AP_Pixits all; import from LibS1AP_Templates all; /** * @desc Common functions description */ group commonFunctions { /** * @desc Indicate if the provided value is greather or equal to 0 * @return true if value of p_int greater than 0 * @param p_int - integer value */ function f_gtZero( // FIXME Do we really need a function for <= mathematical operation??? in integer p_int ) return boolean { if (p_int > 0){ return true; } else{ return false; } } // End of function f_gtZero /** * @desc Increment the provided value by one * @return incremented value of p_int 0 * @param p_int - integer value */ function f_inc( inout UInt32 p_int ) return UInt32 { p_int := p_int + 1; return p_int; } // End of function f_inc } // End of group commonFunctions /** * @desc Receive functions description */ group receivePDU { /** * @desc This is a test step that assign common S1AP * @param p_PDU Extract the message payload from the S1AP PDU */ function f_S1APPDU_Get( inout S1AP_PDU p_PDU ) runs on S1APComponent { vc_recvS1AP_PDU := p_PDU; if (ischosen(p_PDU.initiatingMessage)) { //TODO... } if (ischosen(p_PDU.successfulOutcome)) { //TODO... } if (ischosen(p_PDU.unsuccessfulOutcome)) { //TODO... } } // End of function f_S1APPDU_Get /** * @desc Receive S1AP PDU from protocol port * @param p_PDU template of the message to be received */ function f_recv_S1AP_PDU( in template S1AP_PDU p_PDU ) runs on S1APComponent { var S1AP_PDU v_PDU; tc_wait.start; alt { [] S1_MMEeNB_P.receive(p_PDU) -> value v_PDU { tc_wait.stop; f_S1APPDU_Get(v_PDU) } [] tc_wait.timeout { setverdict(inconc,"*** " & __SCOPE__ & ": INCONC: Message was not received in due time. ***"); //Stop the component in case of timeout all timer.stop; f_componentStop(); } } } // End of function f_recv_S1AP_PDU /** * @desc Receive S1AP PDU with InitiatingMessage payload from protocol port * @param p_initiatingMessage Receive template for InitiatingMessage message */ function f_recv_S1AP_initiatingMessage( template (present) InitiatingMessage p_initiatingMessage := ? ) runs on S1APComponent { f_recv_S1AP_PDU( { initiatingMessage := p_initiatingMessage }) } // End of function f_recv_S1AP_initiatingMessage /** * @desc Receive S1AP PDU with SuccessfulOutcome payload from protocol port * @param p_successfulOutcome Receive template for SuccessfulOutcome message */ function f_recv_S1AP_successfulOutcome( template (present) SuccessfulOutcome p_successfulOutcome := ? ) runs on S1APComponent { f_recv_S1AP_PDU( {successfulOutcome := p_successfulOutcome}) } // End of f_recv_S1AP_successfulOutcome /** * @desc Receive S1AP PDU with UnsuccessfulOutcome payload from protocol port * @param p_unsuccessfulOutcome Receive template for UnsuccessfulOutcome message */ function f_recv_S1AP_unsuccessfulOutcome( template (present) UnsuccessfulOutcome p_unsuccessfulOutcome := ? ) runs on S1APComponent { f_recv_S1AP_PDU( {unsuccessfulOutcome := p_unsuccessfulOutcome}) } // End of function f_recv_S1AP_unsuccessfulOutcome /** * @desc Receive S1AP Message E_RABSetupResponse * @param p_value Receive template for E_RABSetupResponse IEs */ function f_recv_E_RABSetupResponse( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_successfulOutcome(mw_E_RABSetupResponse(p_value)) } // End of f_recv_E_RABSetupResponse /** * @desc Receive S1AP Message ENB DIRECT INFORMATION TRANSFER * @param p_value Receive template for ENB_DIRECT_INFORMATION_TRANSFER IEs * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 9.1.14 eNB DIRECT INFORMATION TRANSFER */ function f_recv_eNB_Direct_Information_Transfer( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_initiatingMessage(mw_eNB_Direct_Information_Transfer(p_value)) } // End of f_recv_eNB_Configuration_Transfer /** * @desc Receive S1AP Message MME DIRECT INFORMATION TRANSFER * @param p_value Receive template for MME_DIRECT_INFORMATION_TRANSFER IEs * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 9.1.15 MME DIRECT INFORMATION TRANSFER */ function f_recv_Mme_Direct_Information_Transfer( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_initiatingMessage(mw_Mme_Direct_Information_Transfer(p_value)) } // End of f_recv_Mme_Configuration_Transfer /** * @desc Receive S1AP Message ENB CONFIGURATION TRANSFER * @param p_value Receive template for ENB_CONFIGURATION_TRANSFER IEs * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 9.1.16 eNB CONFIGURATION TRANSFER */ function f_recv_eNB_Configuration_Transfer( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_initiatingMessage(mw_eNB_Configuration_Transfer(p_value)) } // End of f_recv_eNB_Configuration_Transfer /** * @desc Receive S1AP Message MME CONFIGURATION TRANSFER * @param p_value Receive template for MME_CONFIGURATION_TRANSFER IEs * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 9.1.17 MME CONFIGURATION TRANSFER */ function f_recv_Mme_Configuration_Transfer( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_initiatingMessage(mw_Mme_Configuration_Transfer(p_value)) } // End of f_recv_Mme_Configuration_Transfer /** * @desc Receive S1AP Message DOWNLINK_UE_ASSOCIATED_LPPA_TRANSPORT * @param p_value Receive template for DOWNLINK_UE_ASSOCIATED_LPPA_TRANSPORT IEs * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 9.1.19.1 DOWNLINK UE ASSOCIATED LPPA TRANSPORT */ function f_recv_Downlink_UE_Associated_Lppa_Transport( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_initiatingMessage(mw_DownlinkUEAssociatedLppaTransport(p_value)) } // End of f_recv_Downlink_UE_Associated_Lppa_Transport /** * @desc Receive S1AP Message UPLINK_UE_ASSOCIATED_LPPA_TRANSPORT * @param p_value Receive template for UPLINK_UE_ASSOCIATED_LPPA_TRANSPORT IEs * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 9.1.17 MME CONFIGURATION TRANSFER */ function f_recv_Uplink_UE_Associated_Lppa_Transport( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_initiatingMessage(mw_UplinkUEAssociatedLppaTransport(p_value)) } // End of f_recv_Uplink_UE_Associated_Lppa_Transport /** * @desc Receive S1AP Message DOWNLINK_NON_UE_ASSOCIATED_LPPA_TRANSPORT * @param p_value Receive template for DOWNLINK_NON_UE_ASSOCIATED_LPPA_TRANSPORT IEs * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 9.1.19.3 DOWNLINK NON UE ASSOCIATED LPPA TRANSPORT */ function f_recv_Downlink_Non_UE_Associated_Lppa_Transport( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_initiatingMessage(mw_DownlinkNonUEAssociatedLppaTransport(p_value)) } // End of f_recv_Downlink_Non_UE_Associated_Lppa_Transport /** * @desc Receive S1AP Message UPLINK_NON_UE_ASSOCIATED_LPPA_TRANSPORT * @param p_value Receive template for UPLINK_NON_UE_ASSOCIATED_LPPA_TRANSPORT IEs * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 9.1.19.4 UPLINK NON UE ASSOCIATED LPPA TRANSPORT */ function f_recv_Uplink_Non_UE_Associated_Lppa_Transport( template (present) RecordOf_ProtocolIE p_value := ? ) runs on S1APComponent { f_recv_S1AP_initiatingMessage(mw_UplinkNonUEAssociatedLppaTransport(p_value)) } // End of f_recv_Uplink_Non_UE_Associated_Lppa_Transport } // End of group receivePDU /** * @desc Send functions description */ group sendPDU { /** * @desc This is a test step that assign common S1AP * @param p_PDU The S1AP protocol message to set up */ function f_S1APPDU_Set( inout template (value) S1AP_PDU p_PDU ) runs on S1APComponent { if (ischosen(p_PDU.initiatingMessage)) { //TODO... vc_sendS1AP_PDU:=valueof(p_PDU); } if (ischosen(p_PDU.successfulOutcome)) { //TODO... vc_sendS1AP_PDU:=valueof(p_PDU); } if (ischosen(p_PDU.unsuccessfulOutcome)) { //TODO... vc_sendS1AP_PDU:=valueof(p_PDU); } } // End of function f_S1APPDU_Set /** * @desc Send S1AP PDU to protocol port * @param p_PDU template value message to be send */ function f_send_S1AP_PDU( in template (value) S1AP_PDU p_PDU ) runs on S1APComponent { f_S1APPDU_Set(p_PDU); S1_MMEeNB_P.send(p_PDU); } // End of function f_send_S1APPDU /** * @desc Send S1AP PDU with InitiatingMessage payload from protocol port * @param p_initiatingMessage Send value template for InitiatingMessage message */ function f_send_S1AP_initiatingMessage( in template (value) InitiatingMessage p_initiatingMessage ) runs on S1APComponent { f_send_S1AP_PDU( {initiatingMessage := p_initiatingMessage}) } // End of function f_send_S1AP_initiatingMessage /** * @desc Send S1AP PDU with SuccessfulOutcome payload from protocol port * @param p_successfulOutcome Send value template for SuccessfulOutcome message */ function f_send_S1AP_successfulOutcome( in template (value) SuccessfulOutcome p_successfulOutcome ) runs on S1APComponent { f_send_S1AP_PDU( {successfulOutcome := p_successfulOutcome}) } // End of function f_send_S1AP_successfulOutcome /** * @desc Send S1AP PDU with UnsuccessfulOutcome payload from protocol port * @param p_unsuccessfulOutcome Send value template for UnsuccessfulOutcome message */ function f_send_S1AP_unsuccessfulOutcome( in template (value) UnsuccessfulOutcome p_unsuccessfulOutcome ) runs on S1APComponent { f_send_S1AP_PDU( {unsuccessfulOutcome := p_unsuccessfulOutcome}) } // End of function f_send_S1AP_unsuccessfulOutcome /** * @desc Send S1AP Message E-RAB_SetupRequest * @param p_value Send template with IE for E-RAB_SetupRequest */ function f_send_E_RABSetupRequest(in template (value) RecordOf_ProtocolIE p_value ) runs on S1APComponent { f_send_S1AP_initiatingMessage(m_E_RABSetupRequest(p_value)) } // End of function f_send_E_RABSetupRequest } // End of group sendPDU /** * @desc Setup full procedure functions * @see ETSI TS 136 413 V13.4.0 (2016-10) Clause 8.1 List of S1AP Elementary procedures */ group fullProcedures { /** * @desc Setup a full E-RAB Setup procedure */ function f_rABSetupRequest() runs on S1APComponent { f_send_E_RABSetupRequest(m_E_RABSetupReqIEs( vc_MME_UE_ID, vc_ENB_UE_ID, { m_E_RABToBeSetupItemBearerSUReq(1), m_E_RABToBeSetupItemBearerSUReq( 2, m_e_RABlevelQoSParameters (255) ) } )); f_recv_E_RABSetupResponse(mw_E_RABSetupResIEs_FailedToSetupList( vc_MME_UE_ID, vc_ENB_UE_ID, { mw_E_RABSetupItemBearerSURes(1) }, { mw_E_RABItem( 2, { radioNetwork :=not_supported_QCI_value } ) } )); } // End of function f_rABSetupRequest /** * @desc Setup a full E-RAB Release procedure */ function f_rABSetupRelease() runs on S1APComponent { // TODO } // End of function f_rABSetupRelease } // End of group fullProcedures group externalFunctions { /** * @desc Trigger an ENB direct information Transfer procedure */ external function fx_ENB_Direct_Information_Transfer_procedure_ind() return boolean; /** * @desc Trigger an ENB Configuration Transfer procedure */ external function fx_ENB_Configuration_Transfer_procedure_ind() return boolean; /** * @desc Trigger an MME Configuration Transfer procedure */ external function fx_MME_Configuration_Transfer_procedure_ind() return boolean; /** * @desc Trigger a LPPa Transport procedure using a UE associated signalling on eNodeB * @param p_associated_signalling_mode Set to true for an associated signalling mode, false otherwise */ external function fx_eNB_LPPa_Transport_procedure_ind( in boolean p_associated_signalling_mode ) return boolean; /** * @desc Trigger a LPPa Transport procedure using a UE associated signalling on MME * @param p_associated_signalling_mode Set to true for an associated signalling mode, false otherwise */ external function fx_mme_LPPa_Transport_procedure_ind( in boolean p_associated_signalling_mode ) return boolean; } // End of group externalFunctions group preambles { group preamble_S1AP{ /** * @desc * @verdict */ function f_preambleS1AP_MME() runs on S1APComponent { //TODO:... } // End of function f_preambleS1AP_MME /** * @desc * @verdict */ function f_preambleS1AP_eNB() runs on S1APComponent { //TODO:... } // End of function f_preambleS1AP_eNB } // End of group preamble_S1AP } // End of group preambles group postambles { group postamble_S1AP{ /** * @desc * @verdict */ function f_postambleS1AP_MME() runs on S1APComponent { // TODO:... } // End of function f_postambleS1AP_MME /** * @desc * @verdict */ function f_postambleS1AP_eNB() runs on S1APComponent { // TODO:... } // End of function f_postambleS1AP_eNB } // End of group postamble_S1AP } // End of group postambles /** * @desc Global 'altstep' statements description */ group globalSteps { /** * @desc This is a test step that init S1AP component */ function f_S1AP_Init_Component() runs on S1APComponent { } // End of function f_S1AP_Init_Component /** * @desc Component termination */ function f_S1AP_terminate_component() runs on S1APComponent { log("component terminated - forced!"); deactivate; stop; } // End of function f_S1AP_terminate_component /** * @desc Component termination */ function f_componentStop() runs on S1APComponent { syncPort.send(m_syncClientStop); S1_MMEeNB_P.clear; stop; } // End of function f_componentStop /** * @desc Original copied from older LibCommon_VerdictControl */ function f_getVerdict() // FIXME Are you sure we really need it??? return FncRetCode { var FncRetCode v_ret := e_error; if (getverdict == pass or getverdict == none) { v_ret := e_success; } return v_ret; } // End of function /** * * @desc Wait for particular time before next expected message */ function f_wait(float p_time) // FIXME To be replace by LibCommon.f_sleep!!! runs on S1APComponent { tc_wait.start(p_time); alt { [] tc_wait.timeout{ } } } // End of function f_wait } // End of group globalSteps /** * @desc Default 'altstep' statements description */ group defaultsTestStep { /** * @desc * @verdict */ altstep a_defaultS1AP() runs on S1APComponent { [] any timer.timeout { all timer.stop; if (vc_serverStop==false) { f_selfOrClientSyncAndVerdict("error", e_timeout); } else { stop; } } [] S1_MMEeNB_P.receive (S1AP_PDU:{initiatingMessage := ?}) -> value vc_recvS1AP_PDUDefault { repeat; } [] S1_MMEeNB_P.receive (S1AP_PDU:{successfulOutcome := ?}) -> value vc_recvS1AP_PDUDefault { repeat; } [] S1_MMEeNB_P.receive (S1AP_PDU:{unsuccessfulOutcome := ?}) -> value vc_recvS1AP_PDUDefault { repeat; } [] S1_MMEeNB_P.receive (S1AP_PDU:?) -> value vc_recvS1AP_PDUDefault { if (vc_serverStop==false) { f_selfOrClientSyncAndVerdict("error", e_error); } else { stop; } } [] S1_MMEeNB_P.receive { if (vc_serverStop==false) { f_selfOrClientSyncAndVerdict("error", e_error); } else { stop; } } [] a_shutdown() { // Process temination on error log("*** a_defaultS1AP() : Process temination on error ***"); // Terminate component execution stop; } } // End of altstep a_defaultS1AP altstep a_defaultS1AP_MME() runs on S1APComponent { [] any timer.timeout { all timer.stop; if (vc_serverStop==false) { f_selfOrClientSyncAndVerdict("error", e_timeout); } else { stop; } } //TODO:... } // End of altstep a_defaultS1AP_MME altstep a_defaultS1AP_eNB() runs on S1APComponent { [] any timer.timeout { all timer.stop; if (vc_serverStop==false) { f_selfOrClientSyncAndVerdict("error", e_timeout); } else { stop; } } //TODO:... } // End of altstep a_defaultS1AP_eNB } // End of group defaultsTestStep } // End of module LibS1AP_Steps