LibItsGeoNetworking_Functions.ttcn 113 KB
Newer Older
tepelmann's avatar
tepelmann committed
         * @desc    Get the GeoAnycastArea corresponding to a key
         * @param   p_areaName   Reference key of the searched GeoAnycastArea
         * @return  GeoAnycastArea - The serached GeoAnycastArea
tepelmann's avatar
tepelmann committed
         */
        function f_getGeoAnycastArea(in charstring p_areaName) runs on ItsGeoNetworking
            return f_geoArea2GeoAnycastArea(f_getArea(p_areaName));
        /**
         * @desc    Convert GeoArea type to GeoBroadcastArea
         * @param   p_area  GeoArea to be converted
         * @return  GeoBroadcastArea
tepelmann's avatar
tepelmann committed
        function f_geoArea2GeoBroadcastArea(GeoArea p_area)
        return GeoBroadcastArea {
            var GeoBroadcastArea v_broadcastArea;
            if (p_area.shape == e_geoCircle) {
                v_broadcastArea.geoBroadcastSubType := e_geoBroadcastCircle;
            }
            else if (p_area.shape == e_geoRect) {
                v_broadcastArea.geoBroadcastSubType := e_geoBroadcastRect;
            }
            else if (p_area.shape == e_geoElip) {
                v_broadcastArea.geoBroadcastSubType := e_geoBroadcastElip;
            }
            else {
                v_broadcastArea.geoBroadcastSubType := e_reserved;
            }
            
            v_broadcastArea.geoBroadcastArea := p_area.area;
            
            return v_broadcastArea;
berge's avatar
berge committed
        }
        /**
         * @desc    Convert GeoArea type to GeoAnycastArea
         * @param   p_area  GeoArea to be converted
         * @return  GeoAnycastArea
tepelmann's avatar
tepelmann committed
         */
        function f_geoArea2GeoAnycastArea(GeoArea p_area)
        return GeoAnycastArea {
            var GeoAnycastArea v_anycastArea;
            
            if (p_area.shape == e_geoCircle) {
                v_anycastArea.geoAnycastSubType := e_geoAnycastCircle;
            }
            else if (p_area.shape == e_geoRect) {
                v_anycastArea.geoAnycastSubType := e_geoAnycastRect;
            }
            else if (p_area.shape == e_geoElip) {
                v_anycastArea.geoAnycastSubType := e_geoAnycastElip;
            }
            else {
                v_anycastArea.geoAnycastSubType := e_reserved;
            }
            
            v_anycastArea.geoAnycastArea := p_area.area;
            
            return v_anycastArea;
        }
        
        /**
         * @desc    Compute a square geoArea
         * @param   p_centerLongPosVector   Center point of the square area
         * @param   p_distanceA             Width of the square area in meters
         * @return  GeoArea - Computed geoArea
        function f_computeSquareArea(
tepelmann's avatar
tepelmann committed
            in LongPosVector p_centerLongPosVector,
            in UInt16 p_distanceA
        ) return GeoArea {
            var GeoArea v_geoArea;
            
            v_geoArea := {
                shape := e_geoRect,
                area := {
                    geoAreaPosLatitude := p_centerLongPosVector.latitude,
                    geoAreaPosLongitude := p_centerLongPosVector.longitude,
                    distanceA := p_distanceA,
                    distanceB := p_distanceA,
tepelmann's avatar
tepelmann committed
                    angle := 0
tepelmann's avatar
tepelmann committed
            return v_geoArea;
berge's avatar
berge committed
        /**
         * @desc    Compute a circular geoArea
         * @param   p_centerLongPosVector   Center point of the square area
         * @param   p_distanceA             Radius of the square area in meters
         * @return  GeoArea - Computed geoArea
         */
        function f_computeCircularArea(
tepelmann's avatar
tepelmann committed
            in LongPosVector p_centerLongPosVector,
berge's avatar
berge committed
            in UInt16 p_distanceA
        ) return GeoArea {
                
            var GeoArea v_geoArea;
            
            v_geoArea := {
                shape := e_geoCircle,
                area := {
                    geoAreaPosLatitude := p_centerLongPosVector.latitude,
                    geoAreaPosLongitude := p_centerLongPosVector.longitude,
                    distanceA := p_distanceA,
                    distanceB := 0,
tepelmann's avatar
tepelmann committed
                    angle := 0
tepelmann's avatar
tepelmann committed
            return v_geoArea;
        }
tepelmann's avatar
tepelmann committed
        /**
         * @desc    Compute radius of an circular area
         * @param   p_squareMeters  Square meters of an circular area
         * @return  Computed radius in meters
         * @see     fx_computeRadiusFromCircularArea
         */
        function f_radiusFromCircularArea(
            in float p_squareMeters
        ) return float {
         
//            log("*** f_distance: INFO: calling fx_computeRadiusFromCircularArea() ***");
tepelmann's avatar
tepelmann committed
            return fx_computeRadiusFromCircularArea(p_squareMeters);
        }
        
        /**
         * @desc    Compute distance between two points
         * @param   p_pointA    First point
         * @param   p_pointB    Second point
         * @return  Computed distance in meters
         * @see     fx_computeDistance
        function f_distance(
            in LongPosVector p_pointA,
            in LongPosVector p_pointB
        ) return float {
         
//            log("*** f_distance: INFO: calling fx_computeDistance() ***");
tepelmann's avatar
tepelmann committed
            return fx_computeDistance(p_pointA.latitude, p_pointA.longitude, p_pointB.latitude, p_pointB.longitude);
tepelmann's avatar
tepelmann committed
    } // end geoPositionFunctions
berge's avatar
berge committed
    group geoAltsteps {
berge's avatar
berge committed
        /**
         * @desc The base default.
         */
reinaortega's avatar
reinaortega committed
        altstep a_default() runs on ItsGeoNetworking {
            var LongPosVector v_longPosVectorIut;
            
            [] a_receiveLsRequest(
                ?, ?, v_longPosVectorIut
tepelmann's avatar
tepelmann committed
               ) {
            [] geoNetworkingPort.receive(
                mw_geoNwInd(
                    mw_geoNwSecPdu(
                        mdw_securedMessage_CAMs,
garciay's avatar
garciay committed
                log("*** a_default: WARNING: Skip secured CAM messages ***");
            [] geoNetworkingPort.receive {
                log("*** a_default: WARNING: Received an unexpected message ***");
                repeat;
            }
            [] tc_wait.timeout {
berge's avatar
berge committed
                log("*** a_default: ERROR: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
                f_selfOrClientSyncAndVerdict("error", e_timeout);
berge's avatar
berge committed
                log("*** a_default: ERROR: Timeout while awaiting the reception of a message ***");
                f_selfOrClientSyncAndVerdict("error", e_timeout);
berge's avatar
berge committed
            [] a_shutdown() {
                log("*** a_default: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
tepelmann's avatar
tepelmann committed
                stop;
berge's avatar
berge committed
            }
tepelmann's avatar
tepelmann committed
         * @desc    Neighbour default altstep (answers to LS Requests)
reinaortega's avatar
reinaortega committed
        altstep a_neighbourDefault() runs on ItsGeoNetworking {
            [] a_receiveLsRequestAndReply(
                ?, 
                f_getPosition(vc_componentName).gnAddr.mid,
tepelmann's avatar
tepelmann committed
                f_getPosition(vc_componentName),
                f_getPosition(vc_componentName)
tepelmann's avatar
tepelmann committed
               ) {
tepelmann's avatar
tepelmann committed
            }
            [vc_componentName == c_compNodeB] a_receiveLsRequestAndReply(
tepelmann's avatar
tepelmann committed
                ?, f_getPosition(c_compNodeA).gnAddr.mid,
                f_getPosition(c_compNodeA),
tepelmann's avatar
tepelmann committed
               ) {
tepelmann's avatar
tepelmann committed
            }
        /**
         * @desc The default for handling upper tester messages.
         */
        altstep a_utDefault() runs on ItsBaseGeoNetworking {
            var UtGnEventInd v_ind;
            [] utPort.receive(UtGnEventInd:?) -> value v_ind {
                //store every upper tester indication received
                vc_utInds[lengthof(vc_utInds)] := v_ind;
                repeat;
            }
            [] utPort.receive {
                log("*** " & testcasename() & ": INFO: Received unexpected UT message from IUT ***");
tepelmann's avatar
tepelmann committed
        /**
         * @desc Default handling cf01 de-initialisation.
         */
        altstep a_cf01Down() runs on ItsGeoNetworking {
            [] a_shutdown() {
                f_poDefault();
                f_cf01Down();
                log("*** a_cf01Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
tepelmann's avatar
tepelmann committed
                stop;
tepelmann's avatar
tepelmann committed
            }
        }
        
        /**
         * @desc Default handling cf02 de-initialisation.
         */
        altstep a_cf02Down() runs on ItsMtc {
tepelmann's avatar
tepelmann committed
            [] a_shutdown() {
tepelmann's avatar
tepelmann committed
                log("*** a_cf02Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
        
        /**
         * @desc Default handling cf03 de-initialisation.
         */
        altstep a_cf03Down() runs on ItsMtc {
tepelmann's avatar
tepelmann committed
            [] a_shutdown() {
tepelmann's avatar
tepelmann committed
                log("*** a_cf03Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
        
        /**
         * @desc Default handling cf04 de-initialisation.
         */
        altstep a_cf04Down() runs on ItsMtc {
tepelmann's avatar
tepelmann committed
            [] a_shutdown() {
tepelmann's avatar
tepelmann committed
                log("*** a_cf04Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
berge's avatar
berge committed

        /**
         * @desc Default handling cf05 de-initialisation.
         */
        altstep a_cf05Down() runs on ItsMtc {
            [] a_shutdown() {
                f_cf05Down();
                log("*** a_cf05Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
        
        /**
         * @desc Default handling cf06 de-initialisation.
         */
        altstep a_cf06Down() runs on ItsMtc {
            [] a_shutdown() {
                f_cf06Down();
                log("*** a_cf06Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
berge's avatar
berge committed
        /**
         * @desc Default handling cf07 de-initialisation.
         */
        altstep a_cf07Down() runs on ItsMtc {
            [] a_shutdown() {
                f_cf07Down();
                log("*** a_cf07Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }        
berge's avatar
berge committed
        group geoGeoUnicastAltsteps {
            
            /**
             * @desc    Receive GeoUnicast packet
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec          Expected source position vector
             * @param   p_destinationShortPosVec    Expected destination position vector
             * @param   p_seqNumber                 Expected sequence number
berge's avatar
berge committed
             */
berge's avatar
berge committed
            altstep a_receiveGeoUnicast(
                in template (present) ShortPosVector p_destinationShortPosVec,
                in template (present) UInt16 p_seqNumber
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
berge's avatar
berge committed
                
tepelmann's avatar
tepelmann committed
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwUnicastPacket(
berge's avatar
berge committed
                    p_destinationShortPosVec,
                    p_seqNumber)))) {
tepelmann's avatar
tepelmann committed
                }
tepelmann's avatar
tepelmann committed
            }
berge's avatar
berge committed
            
            /**
             * @desc    Receive GeoUnicast packet for specific destination
             * @param   p_destinationShortPosVec    Expected destination position vector
berge's avatar
berge committed
             */
reinaortega's avatar
reinaortega committed
            altstep a_receiveGeoUnicastWithDestination(in template (present) ShortPosVector p_destinationShortPosVec) runs on ItsGeoNetworking {
berge's avatar
berge committed
                
tepelmann's avatar
tepelmann committed
                [] a_receiveGeoUnicast(p_destinationShortPosVec, ?) {}
tepelmann's avatar
tepelmann committed
            }
berge's avatar
berge committed
            
            /**
             * @desc Receive any GeoUnicast packet
             */
reinaortega's avatar
reinaortega committed
            altstep a_receiveAnyGeoUnicast() runs on ItsGeoNetworking {
berge's avatar
berge committed
                
tepelmann's avatar
tepelmann committed
                [] a_receiveGeoUnicast(?, ?) {}
tepelmann's avatar
tepelmann committed
            }
berge's avatar
berge committed
            
        } // end geoGeoUnicastAltsteps
        
berge's avatar
berge committed
        group geoGeoBroadcastAltsteps {
            
            /**
             * @desc Receive GeoBroadcast packet
             * @param   p_srcLongPosVec     Expected source position vector
             * @param   p_seqNumber         Expected sequence number
berge's avatar
berge committed
             */
            altstep a_receiveGeoBroadcast(
tepelmann's avatar
tepelmann committed
                in template (present) LongPosVector p_srcLongPosVec,
berge's avatar
berge committed
                in template (present) UInt16 p_seqNumber
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
tepelmann's avatar
tepelmann committed
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacket(
berge's avatar
berge committed
                        p_srcLongPosVec,
                        p_seqNumber
                    )))) {
                }
            }
berge's avatar
berge committed
            
            /**
             * @desc Receive GeoBroadcast packet with specific Area and HopLimit
             * @param   p_srcLongPosVec     Expected source position vector
             * @param   p_seqNumber         Expected sequence number
             * @param   p_broadcastArea     Expected geoBroadcastArea
             * @param   p_routerHopLimit    Expected router hop limit
             * @param   p_maxHopLimit       Expected max hop limit (Default: ?)
berge's avatar
berge committed
             */
            altstep a_receiveGeoBroadcastWithAreaWithHopLimit(
tepelmann's avatar
tepelmann committed
                in template (present) LongPosVector p_srcLongPosVec,
berge's avatar
berge committed
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea,
                in template (present) UInt8 p_routerHopLimit,
                in template (present) UInt8 p_maxHopLimit := ?
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithAreaAndHl(
berge's avatar
berge committed
                        p_srcLongPosVec,
                        p_seqNumber,
tepelmann's avatar
tepelmann committed
                    ))) {
berge's avatar
berge committed
                }
berge's avatar
berge committed
            /**
             * @desc Receive GeoBroadcast packet for specific Geobroadcast Area
             * @param   p_srcLongPosVec     Expected source position vector
             * @param   p_seqNumber         Expected sequence number
             * @param   p_broadcastArea     Expected geoBroadcastArea
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            altstep a_receiveGeoBroadcastWithArea(
berge's avatar
berge committed
                in template (present) LongPosVector p_srcLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
tepelmann's avatar
tepelmann committed
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
berge's avatar
berge committed
                        p_srcLongPosVec,
                        p_seqNumber,
                        p_broadcastArea
                    )))) {
                }
berge's avatar
berge committed
        } // end geoGeoBroadcastAltsteps
berge's avatar
berge committed
        group geoGeoAnycastAltsteps {
            
            /**
             * @desc Receive GeoAnycast packet
             * @param   p_srcLongPosVec     Expected source position vector
             * @param   p_senderLongPosVec  Expected sender position vector
             * @param   p_seqNumber         Expected sequence number
berge's avatar
berge committed
             */
            altstep a_receiveGeoAnycast(
tepelmann's avatar
tepelmann committed
                in template (present) LongPosVector p_srcLongPosVec,
berge's avatar
berge committed
                in template (present) LongPosVector p_senderLongPosVec,
                in template (present) UInt16 p_seqNumber
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
tepelmann's avatar
tepelmann committed
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacket(
berge's avatar
berge committed
                        p_srcLongPosVec,
                        p_seqNumber
                    )))) {
                }
            }
            
            /**
             * @desc Receive GeoAnycast packet with specific Area and HopLimit
             * @param   p_srcLongPosVec     Expected source position vector
             * @param   p_senderLongPosVec  Expected sender position vector
             * @param   p_seqNumber         Expected sequence number
             * @param   p_anycastArea       Expected geoAnycastArea
             * @param   p_hopLimit          Expected hop limit
             * @param   p_maxHopLimit       Expected max hop limit (Default: ?)
berge's avatar
berge committed
             */
            altstep a_receiveGeoAnycastWithAreaWithHopLimit(
tepelmann's avatar
tepelmann committed
                in template (present) LongPosVector p_srcLongPosVec,
berge's avatar
berge committed
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoAnycastArea p_anycastArea,
                in template (present) UInt8 p_hopLimit,
                in template (present) UInt8 p_maxHopLimit := ?
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
tepelmann's avatar
tepelmann committed
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
berge's avatar
berge committed
                        p_srcLongPosVec,
                        p_seqNumber,
tepelmann's avatar
tepelmann committed
                        p_anycastArea
                      ),
                      -,
                      p_hopLimit
                    ))) {
berge's avatar
berge committed
                }
berge's avatar
berge committed
            /**
             * @desc Receive GeoAnycast packet for specific GeoAnycast Area
             * @param   p_srcLongPosVec     Expected source position vector
             * @param   p_senderLongPosVec  Expected sender position vector
             * @param   p_seqNumber         Expected sequence number
             * @param   p_anycastArea       Expected geoAnycastArea
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            altstep a_receiveGeoAnycastWithArea(
berge's avatar
berge committed
                in template (present) LongPosVector p_srcLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoAnycastArea p_anycastArea
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
tepelmann's avatar
tepelmann committed
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
berge's avatar
berge committed
                        p_srcLongPosVec,
                        p_seqNumber,
                        p_anycastArea
                    )))) {
                }
berge's avatar
berge committed
        } // end geoGeoAnycastAltsteps
berge's avatar
berge committed
        group geoLocationServiceAltsteps {
berge's avatar
berge committed
            /**
             * @desc    Receive Location Service Request
             * @param   p_seqNumber Expected sequence number of the received LS Request
             * @param   p_gnAddress GN address expected in received LS Request
             * @param   p_reqSrcPosVector Expected source position vector of the received LS Request
berge's avatar
berge committed
             */
            altstep a_receiveLsRequest(
                in template (present) UInt16 p_seqNumber,
                in template (present) GN_Address.mid p_mid,
berge's avatar
berge committed
                out LongPosVector p_reqSrcPosVector
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
                var GeoNetworkingInd v_msg;
                
                [] geoNetworkingPort.receive(
                    mw_geoNwInd(
                        mw_geoNwPdu(
tepelmann's avatar
tepelmann committed
                            mw_geoNwLsRequestPacket(
tepelmann's avatar
tepelmann committed
                                p_mid
tepelmann's avatar
tepelmann committed
                    p_reqSrcPosVector := valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsRequestHeader.srcPosVector);
berge's avatar
berge committed
            }
            
            /**
             * @desc Receive any Location Service Request
             */
reinaortega's avatar
reinaortega committed
            altstep a_receiveAnyLsRequest() runs on ItsGeoNetworking {
                var LongPosVector v_reqSrcPosVector;
                
                [] a_receiveLsRequest(?, ?, v_reqSrcPosVector) {}
            /**
             * @desc Receive any Location Service Reply
             */
            altstep a_receiveAnyLsReply() runs on ItsGeoNetworking {
wattelet's avatar
wattelet committed
                [] geoNetworkingPort.receive( mw_geoNwInd( mw_geoNwPdu( mw_geoNwLsReplyPacket(?, ?) ))) {
                    //ignore and repeat
                    repeat;
berge's avatar
berge committed
            /**
             * @desc Receive Location Service Request and send Location Service Reply
             * @param   p_reqSeqNumber          Expected sequence number of the received LS Request
             * @param   p_gnAddress             GN address expected in received LS Request
             * @param   p_repSrcPosVector       Source position vector of the sent LS Response
tepelmann's avatar
tepelmann committed
             * @param   p_repSenderPosVector    Sender position vector of the sent LS Response
berge's avatar
berge committed
             */
            altstep a_receiveLsRequestAndReply(
berge's avatar
berge committed
                in template (present) UInt16 p_reqSeqNumber,
                in template (value) GN_Address.mid p_mid,
berge's avatar
berge committed
                in template (value) LongPosVector p_repSrcPosVector,
                in template (value) LongPosVector p_repSenderPosVector
reinaortega's avatar
reinaortega committed
            ) runs on ItsGeoNetworking {
                var LongPosVector v_repDstPosVector;
                [] a_receiveLsRequest(p_reqSeqNumber, p_mid, v_repDstPosVector) {
tepelmann's avatar
tepelmann committed
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(
                        m_geoNwLsReplyPacket(
                            p_repSrcPosVector,
                            f_longPosVector2ShortPosVector(v_repDstPosVector),
                            vc_localSeqNumber
tepelmann's avatar
tepelmann committed
                    ))));
berge's avatar
berge committed
                }
            }
          
        } // end geoLocationServiceAltsteps
        
        
    } // end geoAltsteps
    
    group preambles {
        
        /**
         * @desc The default preamble.
         */
reinaortega's avatar
reinaortega committed
        function f_prDefault() runs on ItsGeoNetworking {
            activate(a_default());
berge's avatar
berge committed
            activate(a_utDefault());
        /**
         * @desc Preamble for non-neighbour nodes
tepelmann's avatar
tepelmann committed
         */
reinaortega's avatar
reinaortega committed
        function f_prNonNeighbour() runs on ItsGeoNetworking {
            f_prDefault();
        }
        /**
         * @desc Preamble for neighbour nodes
tepelmann's avatar
tepelmann committed
         */
reinaortega's avatar
reinaortega committed
        function f_prNeighbour() runs on ItsGeoNetworking {
            f_prDefault();
        /**
         * @desc Brings the IUT into an initial state.
         * @remark Component variable vc_hashedId8ToBeUsed shall be set with the IUT certificate to be used
        function f_initialState(Scenario p_scenario := e_staticPosition) runs on ItsBaseGeoNetworking {
garciay's avatar
garciay committed
            
            if (PICS_GN_SECURITY) {
                var Oct8 v_hashedId8ToBeUsed := f_setupIutCertificate(vc_hashedId8ToBeUsed);
                if (oct2int(v_hashedId8ToBeUsed) == 0) {
                    v_hashedId8ToBeUsed := 'FFFFFFFFFFFFFFFF'O; // Reset to unknown value, the IUT will use its own certificates
                f_utInitializeIut(m_secGnInitialize(v_hashedId8ToBeUsed));
garciay's avatar
garciay committed
            } // else, default behavior
            else {
                f_utInitializeIut(m_gnInitialize);
            }
            
            f_acLoadScenario(p_scenario);
            f_acStartScenario();
        /**
         * @desc    Receive and reply to LS Requests
         * @param   p_reqSeqNumber          Expected sequence number of the received LS Request
         * @param   p_gnAddress             GN address expected in received LS Request
         * @param   p_repSrcPosVector       Source position vector of the sent LS Response
         * @param   p_repSenderPosVector    Sender position vector of the sent LS Response
        function f_handleLocationService(
          in template (present) UInt16 p_reqSeqNumber,
          in template (value) GN_Address.mid p_mid,
          in template (value) LongPosVector p_repSrcPosVector,
          in template (value) LongPosVector p_repSenderPosVector
reinaortega's avatar
reinaortega committed
        ) runs on ItsGeoNetworking {
                [] a_receiveLsRequestAndReply(p_reqSeqNumber, p_mid, p_repSrcPosVector, p_repSenderPosVector) {
        /**
         * @desc    Send LS request and receive LS Reply
         * @param   p_reqSrcPosVector   Source position vector of the sent LS Request
         * @param   p_reqSeqNumber      Sequence number of the sent LS Request
         * @param   p_gnAddress         GN address for which the LS Request is sent
         * @param   p_repSrcPosVector   Expected source position vector in received LS Response
         * @return  FncRetCode
        function f_processLocationService(
          in template (value) LongPosVector p_reqSrcPosVector,
          in template (value) UInt16 p_reqSeqNumber,
          in template (value) GN_Address p_gnAddress,
berge's avatar
berge committed
          out LongPosVector p_repSrcPosVector
reinaortega's avatar
reinaortega committed
        ) runs on ItsGeoNetworking return FncRetCode {
            var FncRetCode v_ret := e_error;
            var GeoNetworkingInd v_msg;
            
            f_sendGeoNetMessage(
berge's avatar
berge committed
                m_geoNwReq_linkLayerBroadcast(
tepelmann's avatar
tepelmann committed
                    m_geoNwPdu(
                        m_geoNwLsRequestPacket(
                            p_reqSrcPosVector,
                            p_reqSeqNumber,
                            p_gnAddress
                        )
                    )
                )
            );
            
            tc_ac.start;
            alt {
                [] geoNetworkingPort.receive(
                        mw_geoNwInd(
                            mw_geoNwPdu(
tepelmann's avatar
tepelmann committed
                                mw_geoNwLsReplyPacket(
                                    mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(valueof(p_reqSrcPosVector)))
tepelmann's avatar
tepelmann committed
                    ) -> value v_msg {
                    p_repSrcPosVector := valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsReplyHeader.srcPosVector);
    } // end preambles
    
    group postambles {
        
        /**
         * @desc The default postamble.
         */
reinaortega's avatar
reinaortega committed
        function f_poDefault() runs on ItsGeoNetworking {
            f_acStopScenario();
        /**
         * @desc Postamble for neighbour nodes
tepelmann's avatar
tepelmann committed
         */
reinaortega's avatar
reinaortega committed
        function f_poNeighbour() runs on ItsGeoNetworking {
berge's avatar
berge committed
            f_stopBeingNeighbour();
tepelmann's avatar
tepelmann committed
            f_poDefault();
    group adapterControl {
berge's avatar
berge committed
        /**
         * @desc    Triggers event in the test system adaptation.
         * @param   p_event The event to trigger
         * @return  FncRetCode
reinaortega's avatar
reinaortega committed
        function f_acTriggerEvent(template (value) AcGnPrimitive p_event) runs on ItsBaseGeoNetworking return FncRetCode {
            var FncRetCode v_ret := e_success;
            acPort.send(p_event);
         * @desc    Get the position vector corresponding to a specific GN address
         * @param   p_gnAddress     GN address for which the search is performed
         * @return  LongPosVector - IUT's position
reinaortega's avatar
reinaortega committed
        function f_acGetLongPosVector(GN_Address p_gnAddress) runs on ItsBaseGeoNetworking return LongPosVector {
berge's avatar
berge committed
            var AcGnResponse v_result;
            
            f_acTriggerEvent(m_getLongPosVector(p_gnAddress));
            tc_ac.start;
            alt {
                [] acPort.receive(mw_getLongPosVectorAny(p_gnAddress)) -> value v_result {
                    tc_ac.stop;
                }
                [] acPort.receive {
                    tc_ac.stop;
berge's avatar
berge committed
                    log("*** f_acGetLongPosVector: ERROR: Received unexpected message ***");
                    f_selfOrClientSyncAndVerdict("error", e_error);
berge's avatar
berge committed
                    log("*** f_acGetLongPosVector: ERROR: Timeout while waiting for adapter control event result ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
         * @desc    Triggers test adapter to send beacons for multiple neighbours
         * @param   p_numberOfNeighbour Number of neighbours to simulate
         * @return  FncRetCode
reinaortega's avatar
reinaortega committed
        function f_acStartBeaconingMultipleNeighbour(in integer p_numberOfNeighbour) runs on ItsGeoNetworking return FncRetCode {
            
            return f_acTriggerEvent(m_startBeaconingMultipleNeighbour(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader, p_numberOfNeighbour));
            
        }
        
        /**
         * @desc    Triggers test adapter to enable security support
         * @return  FncRetCode
         */
        function f_acEnableSecurity() runs on ItsBaseGeoNetworking return FncRetCode {
            
            // Local variables
            // Load certificates
            if( not f_loadCertificates(PX_IUT_SEC_CONFIG_NAME) ) {
                return e_error;
            }
            
            // Initialize vc_location
            f_setGenerationLocation(
                f_getTsLatitude(),
                f_getTsLongitude()
            );
            return f_acTriggerEvent(
                AcGnPrimitive:{ acEnableSecurity := m_enableSecurity(
        }
        
        /**
         * @desc    Triggers test adapter to disable security support
         * @return  FncRetCode
         */
        function f_acDisableSecurity() runs on ItsBaseGeoNetworking return FncRetCode {
garciay's avatar
garciay committed
            return f_acTriggerEvent(AcGnPrimitive:{ acDisableSecurity := m_disableSecurity } );
        /**
         * @desc    Triggers event in the test system adaptation.
         * @param   p_event The event to trigger
         * @return  FncRetCode
         */
        function f_acTriggerGnssEvent(template (value) AcGnssPrimitive p_event) runs on ItsBaseGeoNetworking return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            acPort.send(p_event);
            tc_ac.start;
            alt {
                [] acPort.receive(m_acGnssResponseSuccess) {
                    tc_ac.stop;
                }
                [] acPort.receive {
                    tc_ac.stop;
                    log("*** f_acTriggerEvent: ERROR: Received unexpected message ***");
                    f_selfOrClientSyncAndVerdict("error", e_error);
                }
                [] tc_ac.timeout {
                    log("*** f_acTriggerEvent: ERROR: Timeout while waiting for adapter control event result ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
            
            return v_ret;
        }
        
        /**
         * @desc    Loads the given scenario
         * 
         * @param   p_scenario   The scenario to load.
         */
        function f_acLoadScenario(Scenario p_scenario) runs on ItsBaseGeoNetworking {
            
            if (PICS_GNSS_SCENARIO_SUPPORT==true) {
                f_acTriggerGnssEvent(m_loadScenario(p_scenario));
            }
        } // end f_acLoadScenario
        
        /**
         * @desc    Starts a loaded scenario
         */
        function f_acStartScenario() runs on ItsBaseGeoNetworking {
            
            if (PICS_GNSS_SCENARIO_SUPPORT==true) {
                f_acTriggerGnssEvent(m_startScenario);
                vc_scenarioStarted := true;
            }
        } // end f_acStartScenario
        
        /**
         * @desc    Stops a loaded scenario
         */
        function f_acStopScenario() runs on ItsBaseGeoNetworking {
            
            if (PICS_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
                f_acTriggerGnssEvent(m_stopScenario);
                vc_scenarioStarted := false;
            }
        } // end f_acStopScenario
        
    } // end adapterControl
         * @desc    Gets the value of the lifetime in seconds.
         * @param   p_lifetime Lifetime to be converted
         * @return  Lifetime in seconds
reinaortega's avatar
reinaortega committed
        function f_getLifetimeValue(in Lifetime p_lifetime) runs on ItsGeoNetworking return float {
            var float v_lifetime := 0.0;
          
            select (p_lifetime.ltBase) {
                case (e_50ms) {
                    v_lifetime := int2float(p_lifetime.multiplier) * 0.5;
                }
                case (e_1s) {
                    v_lifetime := int2float(p_lifetime.multiplier) * 1.0;
                }
                case (e_10s) {
                    v_lifetime := int2float(p_lifetime.multiplier) * 10.0;
                }
                case (e_100s) {
                    v_lifetime := int2float(p_lifetime.multiplier) * 100.0;
                }
            }
          
            return v_lifetime;
        }
        
        /**
         * @desc    Computes GN timestamp based on current time
         * @return  Unix-Epoch-Time mod 2^32
         */
        function f_computeGnTimestamp() return UInt32 {
tepelmann's avatar
tepelmann committed
            
            //  Timestamp is 1s older than current time to avoid sending beacons coming from the future (time sync between nodes)
            var UInt32 v_timestamp := fx_computeGnTimestamp() - 1000;
tepelmann's avatar
tepelmann committed
            return v_timestamp;    
berge's avatar
berge committed
    group testerFunctions {
berge's avatar
berge committed
        
         * @desc    Gets the tester GN local address for a specific node
         * @param   p_node  Simulated node
         * @return  GN address of simulated node
         */
        function f_getTsGnLocalAddress(in charstring p_node) return GN_Address {
            var GN_Address v_gnAddr := valueof(m_dummyGnAddr);
            
            select (p_node) {
                case (c_compNodeA) {
                    v_gnAddr := PX_TS_NODE_A_LOCAL_GN_ADDR;
                }
                case (c_compNodeB) {
                    v_gnAddr := PX_TS_NODE_B_LOCAL_GN_ADDR;
                }
                case (c_compNodeC) {
                    v_gnAddr := PX_TS_NODE_C_LOCAL_GN_ADDR;
                }
                case (c_compNodeD) {
                    v_gnAddr := PX_TS_NODE_D_LOCAL_GN_ADDR;
                }
wattelet's avatar
wattelet committed
                case (c_compNodeE) {
                    v_gnAddr := PX_TS_NODE_E_LOCAL_GN_ADDR;
                }
                case (c_compNodeF) {
                    v_gnAddr := PX_TS_NODE_F_LOCAL_GN_ADDR;
                }
tepelmann's avatar
tepelmann committed
                    log("*** f_getTsGnLocalAddress: INFO: Unknown component " & p_node & " ***");
berge's avatar
berge committed
        /**
tepelmann's avatar
tepelmann committed
         * @desc    Sends a GeoNetworking message and in case of an included sequence number in the message the
         *          local sequence number will be increased by one.
         * @param   p_geoNetReq The message to send.
tepelmann's avatar
tepelmann committed
         */
reinaortega's avatar
reinaortega committed
        function f_sendGeoNetMessage(in template (value) GeoNetworkingReq p_geoNetReq) runs on ItsGeoNetworking {
tepelmann's avatar
tepelmann committed
            geoNetworkingPort.send(p_geoNetReq);
tepelmann's avatar
tepelmann committed
            if (not (ischosen(p_geoNetReq.msgOut.gnPacket.packet.extendedHeader.shbHeader)
tepelmann's avatar
tepelmann committed
                    or ischosen(p_geoNetReq.msgOut.gnPacket.packet.extendedHeader.beaconHeader))) {
                f_setLocalSequenceNumber();
            }
        }
        
        /**
tepelmann's avatar
tepelmann committed
         * @desc    Sends a GeoNetworking message with a payload and in case of an included sequence number in the message the
tepelmann's avatar
tepelmann committed
         *          local sequence number will be increased by one.
         * @param   p_geoNetReq The message to send.
         * @param   p_payload   The payload to include.
         */
        function f_sendGeoNetMessageWithPayload(
            in template (value) GeoNetworkingReq p_geoNetReq,
            in template (value) Payload p_payload
        ) runs on ItsGeoNetworking {
            p_geoNetReq.msgOut.gnPacket.packet.payload := p_payload;
            geoNetworkingPort.send(p_geoNetReq);
tepelmann's avatar
tepelmann committed
            if (not (ischosen(p_geoNetReq.msgOut.gnPacket.packet.extendedHeader.shbHeader)
tepelmann's avatar
tepelmann committed
                    or ischosen(p_geoNetReq.msgOut.gnPacket.packet.extendedHeader.beaconHeader))) {
tepelmann's avatar
tepelmann committed
                f_setLocalSequenceNumber();
            }
berge's avatar
berge committed
        }
tepelmann's avatar
tepelmann committed
         * @desc    Receive a GeoNetworking message with a payload and in case of an included sequence number in the message the
tepelmann's avatar
tepelmann committed
         *          local sequence number will be increased by one.
         * @param   p_geoNetInd The message to receive.
         * @param   p_payload   The payload to include.
         */
        function f_receiveGeoNetMessageWithPayload(
            in template (present) GeoNetworkingInd p_geoNetInd,
            in template (present) Payload p_payload
        ) return template (present) GeoNetworkingInd {
            var template (present) GeoNetworkingInd v_geoNetInd := p_geoNetInd;
            
            v_geoNetInd.msgIn.gnPacket.packet.payload := p_payload;
            
            return v_geoNetInd;
        }
        
         * @desc    Sets the value of the sequence number for the next event.
reinaortega's avatar
reinaortega committed
        function f_setLocalSequenceNumber() runs on ItsGeoNetworking {
tepelmann's avatar
tepelmann committed
            vc_localSeqNumber := (vc_localSeqNumber + 1) mod c_uInt16Max;
tepelmann's avatar
tepelmann committed
         * @desc    Creates an initial seqence number
         * @return  Time based initial sequence number (increasing with time)
         */
        function f_getInitialSequenceNumber() return UInt16 {