LibItsMgt_Functions.ttcn3 23.7 KB
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 CALMmanagement language "ASN.1:1997" {
        type 
            ITS_scuId
    };
    import from CALMiitsscu language "ASN.1:1997" {
        type PduCounter
    };
    import from CALMmsap language "ASN.1:1997" {
        type 
            CommandRef, MN_Request_request, FWTupdate
    };
    import from CALMfsap language "ASN.1:1997" {
        type
            GCregServer, GCregClient, GCderegClient, GCctxTxCmd, CTXrxNot
    };
    import from LibItsMgt_TypesAndValues {
        type MacAddressType
    };
    import from LibItsMgt_Templates all;
    import from LibItsMgt_Pixits all;
    import from LibIts_Interface {
        type 
            ItsMgt, 
            MgtMNSapCommandReqInd 
    };
    
        // FIXME To be removed
    group mfSAP {
        
//        /**
//         * @desc    Application annouce to its communication needs to the CI selection manager
//         * @param   p_itsAppReg the Request to be processed (ITS_S_Appl_Reg)
//         * @return  'true' on success, 'false' otherwise
//         * @verdict Unchanged
//         * 
//         * See ISO/CD 24102-3 Clause C.2.2
//         */
//        function f_mgtItsApplReg(in template (value) ITS_S_Appl_Reg p_itsAppReg) runs on ItsMgt 
//        return boolean {
//            var CommandRef v_commandRef := f_getNextCommandRef();
//            var MgtMFSapRequestConfirmInd v_result;
//            
//            // Send ITS-S-Appl-Reg MF-REQUEST.request
//            mgtMFSapPort.send(m_mgtMFSapRequestReq(m_itsApplReg(v_commandRef, p_itsAppReg)));
//            tc_ac.start;
//            // Wait for ITS-S-Appl-Reg MF-REQUEST.confirm
//            alt {
//                [] mgtMFSapPort.receive(mw_mgtMFSapRequestConfirmInd(mw_itsApplReg(v_commandRef))) -> value v_result {
//                    tc_ac.stop;
//                    // Return ITS_scuId value
//                    vc_scuId := v_result.msgIn.reqConfirm.lDMregister;
//                    return true;
//                } 
//                [] tc_ac.timeout {
//                    log("*** f_mgtItsApplReg: FAIL: Expected MF-REQUEST.confirm service primitive not received ***");
//                    f_selfOrClientSyncAndVerdict("error", e_error);
//                }
//            } // End of 'alt' statement
//            
//            return false;
//        } // End of function f_mgtItsApplReg
        
//        /**
//         * @desc    Allows an ITS-S application to announce its communication needs to the CI selection manager
//         * @param   p_gCregClient Groupcast registration message
//         * @return  'true' on success, 'false' otherwise
//         * @verdict Unchanged on success, set to fail on error (e_timeout)
//         * 
//         * See ISO/CD 24102-3 Clause C.2.2
//         */
//        function f_mgtItsApplRegToGroupcasting(in template (value)GCregClient p_gCregClient) runs on ItsMgt 
//        return boolean {
//            var CommandRef v_commandRef := f_getNextCommandRef();
//            
//            // Send GCregClient MF-REQUEST.request
//            mgtMFSapPort.send(m_mgtMFSapRequestReq(m_gCregClientReqReq(v_commandRef, p_gCregClient)));
//            tc_ac.start;
//            // Wait for GCregClient MF-REQUEST.confirm
//            alt {
//                [] mgtMFSapPort.receive(mw_mgtMFSapRequestConfirmInd(mdw_gCregClientReqConf(v_commandRef))) {
//                    tc_ac.stop;
//                    return true;
//                } 
//                [] tc_ac.timeout {
//                    log("*** f_mgtItsApplRegToGroupcasting: FAIL: Expected MF-REQUEST.confirm service primitive not received ***");
//                    f_selfOrClientSyncAndVerdict("error", e_error);
//                }
//            } // End of 'alt' statement
//            
//            return false;
//        } // End of function f_mgtItsApplRegToGroupcasting
        
//        /**
//         * @desc    Allows an ITS-S application to deregister its registration information at the groupcasting manager using the services of the groupcasting registration handler
//         * @param   p_gCderegClient Groupcast deregistration message
//         * @return  'true' on success, 'false' otherwise
//         * @verdict Unchanged on success, set to fail on error (e_timeout)
//         * 
//         * See ISO/CD 24102-3 Clause C.2.8
//         */
//        function f_mgtItsApplDeregToGroupcasting(in template (value)GCderegClient p_gCderegClient) runs on ItsMgt 
//        return boolean {
//            var CommandRef v_commandRef := f_getNextCommandRef();
//            
//            // Send GCderegClient MF-REQUEST.request
//            mgtMFSapPort.send(m_mgtMFSapRequestReq(m_gCderegClientReqReq(v_commandRef, p_gCderegClient)));
//            tc_ac.start;
//            // Wait for GCderegClient MF-REQUEST.confirm
//            alt {
//                [] mgtMFSapPort.receive(mw_mgtMFSapRequestConfirmInd(mdw_gCderegClientReqConf(v_commandRef))) {
//                    tc_ac.stop;
//                    return true;
//                } 
//                [] tc_ac.timeout {
//                    log("*** f_mgtItsApplDeregToGroupcasting: FAIL: Expected MF-REQUEST.confirm service primitive not received ***");
//                    f_selfOrClientSyncAndVerdict("error", e_error);
//                }
//            } // End of 'alt' statement
//            
//            return false;
//        } // End of function f_mgtItsApplDeregToGroupcasting
        
//        /**
//         * @desc 
//         * @param p_commandRef
//         * @param p_gCregServer
//         * @verdict Unchanged
//         */
//        function f_mgtGenerateGCregServer(in CommandRef p_commandRef, in template (value) GCregServer p_gCregServer) runs on ItsMgt {
//            // Send GCregServer MF-COMMAND.request
//            mgtMFSapPort.send(m_mgtMFSapRequestReq(m_gCregServerRequestReq(p_commandRef, p_gCregServer)));
//        } // End of function f_mgtGenerateGCregServer
        
    } // End of group mfSAP
    
        // FIXME To be removed
    group mnSap {
        
        /**
         * @desc  Generate COMMAND.request/GCctxTxCmd message on MN-SAP 
         * @param p_commandRef  Unique cyclic reference number of command. Same value as in related MN-REQUEST.request
         * @param p_gCctxTxCmd "Service Context Message" (CTX)
         * @verdict Unchanged
         */
        // FIXME To be removed - Moved on NF-SAP
//        function f_mgtGenerateGCctxTxCmd(in CommandRef p_commandRef, in template (value) GCctxTxCmd p_gCctxTxCmd) runs on ItsMgt {
//            
//            // Send GCctxTxCmd MF-COMMAND.request
//            mgtMNSapPort.send(m_mgtMNSapCommandReq(m_gCctxTxCmdComReq(p_commandRef, p_gCctxTxCmd)));
//        } // End of function f_mgtGenerateGCctxTxCmd
        
        /**
         * @desc  Generate REQUEST.request/CTXrxNot message on MN-SAP 
         * @param p_commandRef  Unique cyclic reference number of command. Same value as in related MN-REQUEST.request
         * @param p_cTXrxNot    TODO
         * @verdict Unchanged
         */
        // FIXME To be removed - Moved on NF-SAP
//        function f_mgtGenerateCTXrxNot(in CommandRef p_commandRef, in template (value) CTXrxNot p_cTXrxNot) runs on ItsMgt {
//            // Send CTXrxNot MF-REQUEST.request
//            mgtMNSapPort.send(m_mgtMNSapRequestReq(m_cTXrxNotRequestReq(p_commandRef, p_cTXrxNot)));
//        } // End of function f_mgtGenerateCTXrxNot
        
    } // end of group mnSap
    
    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_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_mgtMNSapCommandInd(mw_mnCommandConfirm_any)) { // Receive any MF-COMMAND.confirm message
                    log("*** a_mgtMNSapPortDefault: INFO: MN-SAP service primitive MF-COMMAND.confirm received in default ***");
                    repeat;
                }
                [] mgtMNSapPort.receive(mw_mgtMNSapRequestConfirmInd(mw_mnRequestConfirm_any)) { // Receive any MF-REQUEST.confirm message
                    log("*** a_mgtMNSapPortDefault: INFO: MN-SAP service primitive MF-REQUEST.confirm received in default ***");
                    repeat;
                }
                [] mgtMNSapPort.receive(mw_mgtMNSapRequestReqInd(mw_mnRequestRequest_any)) { // Receive any MF-REQUEST.requesy message
                    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 MgtMNSapCommandReqInd v_fWTupdate;
                
                [] mgtMNSapPort.receive(mw_mgtMNSapCommandReqInd(mw_fWTUpdateCommandReq)) -> value v_fWTupdate {
                    // TODO Check if vc_noFNTPfwtEntry is used
                    //vc_noFNTPfwtEntry := v_fWTupdate.msgIn.command_param.mnCmd.fWTupdate.update.fntp.delete.fntp.reference;
                    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_mgtMNSapRequestReqInd(mdw_fWTSetNotRequestReq)) {
                    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_mgtMNSapRequestConfirmInd(mdw_cTXrxNotRequestConf(p_commandRef))) {
//                    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 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 {
        
        function f_getIutSourceITS_scuId() return ITS_scuId {
            return PX_SRC_ITS_SCU_ID;
        }
        
        function f_getIutDestITS_scuId() return ITS_scuId {
            return PX_DST_ITS_SCU_ID;
        }
        
    } // End of group iutFunctions
    
} // End of module LibItsMgt_Functions