Skip to content
LibItsMgt_Functions.ttcn3 19.9 KiB
Newer Older
garciay's avatar
garciay committed
/**
 *  @author     ETSI / STF422_EETS
 *  @version    $URL:$
 *              $Id:$
 *  @desc       Inter-ITS-SCU communications (ISO 24102-4) functions
 */
module LibItsMgt_Functions {
    
    // LibCommon
    import from LibCommon_BasicTypesAndValues {
        const 
            c_uInt8Max;
    };
    import from LibCommon_Sync {
        function
            f_selfOrClientSyncAndVerdict, f_selfOrClientSyncAndVerdictPreamble
    };
    import from LibCommon_VerdictControl all;
    
    // LibIts
    import from CALMllsap language "ASN.1:1997" {
        type 
            MedType, CIaClass, CIclass 
    }; 
garciay's avatar
garciay committed
    import from CALMmanagement language "ASN.1:1997" {
        type 
            ITS_scuId
    };
    import from CALMiitsscu language "ASN.1:1997" {
        type 
            IIC_Request, 
            ITS_SCUtype, 
            PduCounter 
garciay's avatar
garciay committed
    };
    import from CALMmsap language "ASN.1:1997" {
        type 
            CommandRef, 
            MN_Request_request, FWTupdate, 
            MF_Request_request 
garciay's avatar
garciay committed
    };
    import from CALMfsap language "ASN.1:1997" {
        type
            GCregServer, GCregClient, GCderegClient, GCctxTxCmd, CTXrxNot
    };
    import from LibItsMgt_Templates all;
    import from LibItsMgt_Pixits all;
    import from LibIts_Interface {
        type 
            IiscReq, IiscResp, 
garciay's avatar
garciay committed
            ItsMgt, 
            MgtMNSapCommandReq 
    group functions {
        
        /**
         * @desc    Triggers a request command event in the test system adaptation.
         * @param   p_requestRequest The remote commad to trigger
         * @return  FncRetCode
         */
        function f_mgtMFTriggerRequest(
            in template (value) MF_Request_request p_requestRequest
        ) runs on ItsMgt return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            mgtMFSapPort.send(m_mgtMFSapRequestReq(p_requestRequest));
            
            return v_ret;
        }
        
    } // End of group functions
    
garciay's avatar
garciay committed
    group mgtAltsteps {
        
        group mfSap {
            
            /**
             * @desc The base default.
             * See ISO/CD 24102-3 Clause 8.2
             */
            altstep a_mgtMFSapPortDefault() runs on ItsMgt {
                [] mgtMFSapPort.receive(mw_mgtMFSapCommandReq(mw_mfCommandRequest_any)) { // Receive any MF-COMMAND.request message
                    log("*** a_mgtMFSapPortDefault: INFO: MF-SAP service primitive received in default ***");
                    repeat;
                }
                [] mgtMFSapPort.receive(mw_mgtMFSapRequestReq(mw_mfRequestRequest_any)) { // Receive any MF-COMMAND.request message
                    log("*** a_mgtMFSapPortDefault: INFO: MF-SAP service primitive received in default ***");
                    repeat;
                }
                // FIXME Add support of response to CommandRequest & RequestRequest
garciay's avatar
garciay committed
//                [] mgtMFSapPort.receive(mw_mgtMFSapCommandInd(mw_mfCommandRequest_any)) { // Receive any MF-COMMAND.request message
//                    log("*** a_mgtMFSapPortDefault: INFO: MF-SAP service primitive received in default ***");
//                    repeat;
//                }
//                [] mgtMFSapPort.receive(mw_mgtMFSapRequestConfirmInd(mw_mfRequestConfirm_any)) { // Receive any MF-REQUEST.confirm message
//                    log("*** a_mgtMFSapPortDefault: INFO: MF-SAP service primitive received in default ***");
//                    repeat;
//                }
                [] mgtMFSapPort.receive { // Receive unknown message
                    log("*** a_mgtMFSapPortDefault: ERROR: event received on MgtMFSapPort port in default ***");
                    f_selfOrClientSyncAndVerdict("error", e_error);
                }
            } // End of altstep a_mgtMFSapPortDefault
            
//            /**
//             * @desc  Wait for REQUEST.confirm/GCregServer MF-REQUEST.confirm
//             * @param p_commandRef Unique cyclic reference number of command. Same value as in related MN-REQUEST.request
//             * @verdict Unchanged
//             */
//            altstep a_mgtAwaitGCregServerReqConf(in CommandRef p_commandRef) runs on ItsMgt {
//                
//                [] mgtMFSapPort.receive(mw_mgtMFSapRequestConfirmInd(mdw_gCregServerRequestConf(p_commandRef))) {
//                    log("*** a_mgtAwaitGCregServerReqConf: INFO: MF-SAP GCregServer service primitive received ***");
//                    repeat;
//                }
//            } // End of altstep a_mgtAwaitGCregServerReqConf
            
        } // End of group mfSap
        
        group mnSap {
            
            /**
             * @desc The base default.
             * See ISO/CD 24102-3 Clause 8.2
             */
            altstep a_mgtMNSapPortDefault() runs on ItsMgt {
                [] mgtMNSapPort.receive(mw_mgtMNSapCommandConfirm(mw_mnCommandConfirm_any)) { // Receive any MF-COMMAND.confirm message
garciay's avatar
garciay committed
                    log("*** a_mgtMNSapPortDefault: INFO: MN-SAP service primitive MF-COMMAND.confirm received in default ***");
                    repeat;
                }
                [] mgtMNSapPort.receive(mw_mgtMNSapRequestConfirm(mw_mnRequestConfirm_any)) { // Receive any MF-REQUEST.confirm message
garciay's avatar
garciay committed
                    log("*** a_mgtMNSapPortDefault: INFO: MN-SAP service primitive MF-REQUEST.confirm received in default ***");
                    repeat;
                }
                [] mgtMNSapPort.receive(mw_mgtMNSapRequestReq(mw_mnRequestRequest_any)) { // Receive any MF-REQUEST.request message
garciay's avatar
garciay committed
                    log("*** a_mgtMNSapPortDefault: INFO: MN-SAP service primitive MF-REQUEST.request received in default ***");
                    repeat;
                }
                [] mgtMNSapPort.receive { // Receive unknown message
                    log("*** a_mgtMNSapPortDefault: ERROR: event received on MgtMNSapPort port in default ***");
                    f_selfOrClientSyncAndVerdict("error", e_error);
                }
            } // End of altstep a_mgtMNSapPortDefault
            
            /**
             * @desc    Wait for MN_COMMAND/FWTupdate message
             * @verdict Unchanged
             * @see     ISO/WD 24102-4 - Clause 7.2.2
             */
            altstep a_mgtSapAwaitFWTupdate() runs on ItsMgt { 
                var MgtMNSapCommandReq v_fWTupdate;
                [] mgtMNSapPort.receive(mw_mgtMNSapCommandReq(mw_fWTUpdateCommandReq)) -> value v_fWTupdate {
garciay's avatar
garciay committed
                    // TODO Check if vc_noFNTPfwtEntry is used
                    //vc_noFNTPfwtEntry := v_fWTupdate.msgIn.command_param.mnCmd.fWTupdate.update.fntp.reference;
garciay's avatar
garciay committed
                    log("*** a_mgtSapAwaitFWTupdate: INFO: MN-SAP FWTupdate service primitive received: vc_noFNTPfwtEntry=" & int2str(vc_noFNTPfwtEntry) & " ***");
                }
            } // End of altstep a_mgtSapAwaitFWTupdate
            
            /**
             * @desc    Wait for a notification of creation of an entry in a forwarding table.
             * @see     ISO/WD 24102-4 Clause E.2.2 FWTsetNot
             * @verdict Unchanged
             */
            altstep a_mgtAwaitFWTsetNot() runs on ItsMgt {
                
                [] mgtMNSapPort.receive(mw_mgtMNSapRequestReq(mdw_fWTSetNotRequestReq)) {
garciay's avatar
garciay committed
                    log("*** a_mgtAwaitFWTupdateNot: INFO: MN-SAP FWTupdateNot service primitive received ***");
                }
            } // End of altstep a_mgtAwaitFWTupdateNot
            
//            /**
//             * @desc    Wait for a notification of an update of an entry in a forwarding table.
//             * @see     ISO/WD 24102-4 Clause E.2.3 FWTupdateNot
//             * @verdict Unchanged
//             */
//            altstep a_mgtAwaitFWTupdateNot() runs on ItsMgt {
//                
//                [] mgtMNSapPort.receive(mw_mgtMNSapRequestReqInd(mdw_fWTupdateNotRequestReq)) {
//                    log("*** a_mgtAwaitFWTupdateNot: INFO: MN-SAP FWTupdateNot service primitive received ***");
//                }
//            } // End of altstep a_mgtAwaitFWTupdateNot
//            
            /**
             * @desc    Wait for a notification of deletion of an entry in a forwarding table.
             * @see     ISO/WD 24102-4 Clause E.2.4 FWTdeleteNot
             * @verdict Unchanged
             */
            // FIXME To be removed - Moved on NF-SAP
//            altstep a_mgtAwaitFWTdeleteNot() runs on ItsMgt {
//                
//                [] mgtMNSapPort.receive(mw_mgtMNSapRequestReqInd(mdw_fWTdeleteNotRequestReq)) {
//                    log("*** a_mgtAwaitFWTdeleteNot: INFO: MN-SAP FWDdelateNot service primitive received ***");
//                }
//            } // End of altstep a_mgtAwaitFWTdeleteNot
            
//            /**
//             * @desc  Wait for REQUEST.confirm/CTXrxNot MF-REQUEST.confirm
//             * @param p_commandRef Unique cyclic reference number of command. Same value as in related MN-REQUEST.request
//             * @verdict Unchanged
//             */
//            altstep a_mgtAwaitCTXrxNotReqConf(in CommandRef p_commandRef) runs on ItsMgt {
//                
//                [] mgtMNSapPort.receive(mw_mgtMNSapRequestConfirm(mdw_cTXrxNotRequestConf(p_commandRef))) {
garciay's avatar
garciay committed
//                    tc_ac.stop;
//                    log("*** a_mgtAwaitCTXrxNotReqConf: INFO: MN-SAP service primitive received ***");
//                }
//            } // End of altstep a_mgtAwaitCTXrxNotReqConf
//            
        } // End of group mnSap
        
    } // End of group mgtAltsteps
    
    group iiscFunctions {
        
        /**
         * @desc    Triggers a request command event in the test system adaptation.
         * @param   p_rCmd The remote commad to trigger
         * @return  FncRetCode
         */
        function f_iiscTriggerRequest(
            in template (value) IIC_Request p_rCmd
        ) runs on ItsMgt return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            iiscPort.send(m_iiscReq(p_rCmd));
            
            return v_ret;
        }
        
    } // End of group iiscFunctions
    
    
    
garciay's avatar
garciay committed
    group iiscAltsteps {
        
//        /**
//         * @desc Trap for not processed IICP message
//         * @verdict Unchanged
//         */
//        altstep a_iiscAwaitFWTupdateNot(
//            in template (value) ITS_scuId p_sourceITS_scuId,
//            in template (value) ITS_scuId p_destinationITS_scuId,
//            in template (value) PduCounter p_pduCounter
//        ) runs on ItsMgt { 
//            [] iiscPort.receive(//mw_iiscResp(mdw_fWTupdateNotRequestReq)) {
//                mw_iiscResp(
//                    mw_iiscMnRequestReq(
//                        p_sourceITS_scuId,
//                        p_destinationITS_scuId,
//                        p_pduCounter,
//                        mdw_fWTupdateNotRequestReq))) {
//                log("*** a_iiscAwaitFWTupdateNot: INFO: IISC FWTupdateNot service primitive received ***");
//                repeat;
//            }
//        } // End of function a_iiscAwaitFWTupdateNot
        
        /**
         * @desc  Inter-ITS-SCU communications MN-rreq (see ISO/CD 24102-5) with payload MN-Request "SAMrxNot" (see ISO/CD 24102-3 & ISO/CD 24102-5)
         * @param p_sourceITS-scuId        ITS-SCU-ID of the source ITS-SCU which produces the request
         * @param p_destinationITS-scuId   ITS-SCU-ID of the destination ITS-SCU which shall evaluate the request
         * @param p_pduCounter             Even number generated fro a cyclic counter at the ITS-SCU
         * @param p_mn_rreq                The MN-REQUEST.request/SAMrxNot to be forwarded
         * @verdict Unchanged
         */
//        altstep a_iiscAwaitSAMrxNotRequestReq(
//            in template (value) ITS_scuId p_sourceITS_scuId,
//            in template (value) ITS_scuId p_destinationITS_scuId,
//            in template (value) PduCounter p_pduCounter,
//            in template (value) MN_Request_request p_mn_rreq // FIXME Replace MN_Request_request by SAMrxNot template
//        ) runs on ItsMgt {
//            [] iiscPort.receive(
//                mw_iiscResp(
//                    mw_iiscMnRequestReq(
//                        p_sourceITS_scuId,
//                        p_destinationITS_scuId,
//                        p_pduCounter,
//                        p_mn_rreq))) { // Receive MN-REQUEST.request/SAMrxNot message
//                log("*** a_iiscAwaitSAMrxNotRequestReq: INFO: Remote command service primitive received in default ***");
//                repeat;
//            }
//        } // End of altstep a_iiscAwaitSAMrxNotRequestReq
        
        /**
         * @desc  Inter-ITS-SCU communications MN-rreq (see ISO/WD 24102-4) with payload MN-Request "CTXrxNot" (see ISO/CD 24102-3 & ISO/CD 24102-5)
         * @param p_sourceITS-scuId        ITS-SCU-ID of the source ITS-SCU which produces the request
         * @param p_destinationITS-scuId   ITS-SCU-ID of the destination ITS-SCU which shall evaluate the request
         * @param p_pduCounter             Even number generated fro a cyclic counter at the ITS-SCU
         * @param p_mn_rcmd                The MN-REQUEST.request/SAMrxNot to be forwarded
         * @verdict Unchanged
         */
//        altstep a_iiscAwaitCTXrxNotRequestReq(
//            in template (value) ITS_scuId p_sourceITS_scuId,
//            in template (value) ITS_scuId p_destinationITS_scuId,
//            in template (value) PduCounter p_pduCounter,
//            in template (value) MN_Request_request p_mn_rreq // FIXME Replace MN_Request_request by CTXrxNot template
//        ) runs on ItsMgt {
//            [] iiscPort.receive(mw_iiscResp(mw_iiscMnRequestReq(
//                    p_sourceITS_scuId,
//                    p_destinationITS_scuId,
//                    p_pduCounter,
//                    p_mn_rreq))) { // Receive MN-REQUEST.request/CTXrxNot message
//                log("*** a_iiscAwaitCTXrxNotRequestReq: INFO: Remote command service primitive received in default ***");
//                repeat;
//            }
//        } // End of altstep a_iiscAwaitCTXrxNotRequestReq
        
        /**
         * @desc Trap for not processed IICP message.
         * @verdict Set to fail on unknown message
         */
        altstep a_iiscDefault() runs on ItsMgt {
            // FIXME To be removed if we have not to check remote command request
//            [] iiscPort.receive(mw_iiscReq(mw_iiscRequest_any)) { // Receive any IIC-Request message
//                log("*** a_iiscDefault: INFO: Remote IIC-Request command service primitive received in default ***");
//                repeat;
//            }
garciay's avatar
garciay committed
            [] iiscPort.receive(mw_iiscResp(mw_iiscResponse_any)) { // Receive any IIC-Response message
                log("*** a_iiscDefault: INFO: Remote IIC-Response command service primitive received in default ***");
                repeat;
            }
            [] iiscPort.receive { // Receive unknown message
                log("*** a_iiscDefault: ERROR: event received on IISC port in default ***");
                f_selfOrClientSyncAndVerdict("error", e_error);
            }
        } // End of altstep a_iiscDefault
        
    } // End of group iiscAltsteps
    
    group preambule {
        
//        /**
//         * @desc TODO
//         * 
//         * See ISO/CD 29281-2 Clause 7.8.1
//         */
//        function f_fntpForwardingTableRegisterEntry() runs on ItsMgt {
//            var PduCounter v_pduCounter;
//            var CommandRef v_commandRef;
//                
//            // Get a pdu counter value
//            v_pduCounter := f_getNextPduCounter();
//            v_commandRef := f_getNextCommandRef();
//                
//            // Send FWSet MN-COMMAND
//            iiscPort.send(m_iiscReq(
//                m_remoteMnCommandRequest(
//                    PX_SRC_ITS_SCU_ID, 
//                    PX_DST_ITS_SCU_ID, 
//                    v_pduCounter,
//                    m_mnCommandRequest(
//                        v_commandRef,
//                        m_mnFWTSet(
//                            PX_HOST_CIID,
//                            PX_HOST_SCU_ID,
//                            PX_REMOTE_PORT,
//                            PX_HOST_SCU_ID,
//                            PX_USER_PRIORITY)))));
//            tc_ac.start;
//            alt {
//                [] iiscPort.receive(mw_iiscResp(
//                mw_mnCommandConfirm(
//                    PX_DST_ITS_SCU_ID, 
//                    PX_SRC_ITS_SCU_ID, 
//                    v_pduCounter + 1, // ISO/WD 24102-4 - Clause 6.2.1
//                    mw_mnCommandConfirmAny // FIXME Use a more restrictive template
//                ))) {
//                    tc_ac.stop;
//                }
//                [] tc_ac.timeout {
//                    log("*** f_fntpForwardingTableRegisterEntry: INCONC: Pre-conditions: Failed to initialize FNTP Forwarding Table ***");
//                    f_selfOrClientSyncAndVerdictPreamble("error", e_timeout);
//                }
//            } // End of 'alt' statement
//                
//        } // End of function f_fntpForwardingTableRegisterEntry
        
    } // End of group preambule
    
    group testerFunctions {
        
        /**
         * @desc    Increments the pdu counter and returns the new value
         * @return  The new pdu counter value
         * 
         * See ISO/WD 24102-4 - Clause 6.2.1
         */
        function f_getNextPduCounter() runs on ItsMgt return PduCounter {
            vc_pduCounter := (vc_pduCounter + 2) mod (c_uInt8Max - 1); // ISO/WD 24102-4 - Clause 6.2.1: modulus 254
            return vc_pduCounter;
        } // End of function f_getNextPduCounter
        
        /**
         * @desc    Increments the commandRef value and returns it
         * @return  The new commandRef value
         */
        function f_getNextCommandRef() runs on ItsMgt return CommandRef {
            vc_commandRef := (vc_commandRef + 1) mod (c_uInt8Max + 1);
            return vc_commandRef;
        } // End of function f_getNextCommandRef
        
    } // End of group testerFunctions
    
    group iutFunctions {
        
        /**
         * @desc    TODO
         * @return  TODO
         * @verdict Unchanged
         * @see     PX_SRC_ITS_SCU_ID
         */
garciay's avatar
garciay committed
        function f_getIutSourceITS_scuId() return ITS_scuId {
            return PX_SRC_ITS_SCU_ID;
        }
        
        /**
         * @desc    TODO
         * @return  TODO
         * @verdict Unchanged
         * @see     PX_DST_ITS_SCU_ID
         */
garciay's avatar
garciay committed
        function f_getIutDestITS_scuId() return ITS_scuId {
            return PX_DST_ITS_SCU_ID;
        }
        
        /**
         * @desc    TODO
         * @return  TODO
         * @verdict Unchanged
         * @see     PX_SRC_ITS_SCU_TYPE
         */
        function f_getIutSourceITS_scuType() return ITS_SCUtype {
            return PX_SRC_ITS_SCU_TYPE;
        }
        
        /**
         * @desc    TODO
         * @return  TODO
         * @verdict Unchanged
         * @see     PX_MED_TYPE
         */
        function f_getIutMedType() return MedType { 
            return PX_MED_TYPE; 
        }
        
        /**
         * @desc    TODO
         * @return  TODO
         * @verdict Unchanged
         * @see     PX_CIACLASS
         */
        function f_getIutCIaClass() return CIaClass { 
            return PX_CIACLASS; 
        }
        
        /**
         * @desc    TODO
         * @return  TODO
         * @verdict Unchanged
         * @see     PX_CICLASS
         */
        function f_getIutCIClass() return CIclass { 
            return PX_CICLASS; 
        }
        
garciay's avatar
garciay committed
    } // End of group iutFunctions
    
} // End of module LibItsMgt_Functions