ItsGeoNetworking_TestCases.ttcn 913 KB
Newer Older
filatov's avatar
filatov committed
/**
 *  @author     ETSI / STF405 / STF449
 *  @version    $URL$
 *              $Id$
 *  @desc       GeoNetworking Testcases (TP version: 0.0.11)
 *
 */
module ItsGeoNetworking_TestCases {
    
    // Libcommon
    import from LibCommon_BasicTypesAndValues all;
    import from LibCommon_Time all;
    import from LibCommon_VerdictControl all;
    import from LibCommon_Sync all;
    
    // LibIts
    import from LibItsCommon_Functions all;
    import from LibItsGeoNetworking_TestSystem all;
    import from LibItsGeoNetworking_Functions all;
    import from LibItsGeoNetworking_Templates all;
    import from LibItsGeoNetworking_TypesAndValues all;
    import from LibItsGeoNetworking_Pics all;

    // 6.2.1
    group geoFormatingAndDataValidity {
        
        // 6.2.1.1
        group geoFdvBasicHeader {
            
            /**
             * @desc    Testing defined values of default Gn parameters in the basic header
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet
             *      }
             *      then {
             *          the IUT sends a GeoUnicast packet
             *              containing a correctly formatted Basic Header
             *                  containing version field
             *                      set to itsGnProtocolVersion MIB parameter
             *                  containing RHL field
             *                      set to itsGnDefaultHopLimit MIB parameter
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/BAH/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.2 , 8.6.2 and Annex G
             */
            testcase TC_GEONW_FDV_BAH_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(vc_componentName);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwUnicastPacket(?, ?), -, f_getDefaultHopLimit()))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Basic Header correctly formatted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_BAH_BV_01
            
            /**
             * @desc    Testing discard of packet having incorrect version
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives the SHB packet from ItsNodeB
             *              containing a correctly formatted Basic Header
             *                  containing version field
             *                      set to value not equal to itsGnProtocolVersion MIB parameter
             *      }
             *      then {
             *          the IUT discards the received SHB packet
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/BAH/BV/02
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.3
             */
            testcase TC_GEONW_FDV_BAH_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_gnPacket := m_geoNwPdu(m_geoNwShbPacket(v_longPosVectorNodeB));
                v_gnPacket.basicHeader.version := valueof(v_gnPacket.basicHeader.version) + 1;
filatov's avatar
filatov committed
                
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                
                f_sleep(PX_TAC);
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                    // empty on purpose 
                }
                if(i < lengthof(vc_utInds)) {
                    log("*** " & testcasename() & ": FAIL: GN was transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": PASS: GN was discarded and not transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_BAH_BV_02
            
        } // end geoFdvBasicHeader
        
        // 6.2.1.2
        group geoFdvCommonHeader {
            
            /**
             * @desc    Common GeoNetworking header validity test (PL field)
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT generates a Beacon message
             *      }
             *      then {
             *          the IUT sends a GeoNetworking message
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '1' (BEACON)
             *                  containing HST field
             *                      set to '0' (UNSPECIFIED)
             *                  containing PL field
             *                      set to '0'
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/COH/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.7.4, 8.8.6 and 9.3.6
             */
            testcase TC_GEONW_FDV_COH_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBeaconPacket(?))))  {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Common Header correclty formatted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                f_acTriggerEvent(m_stopPassBeaconing);
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_COH_BV_01
            
            /**
             * @desc    Common GeoNetworking header validity test (PL field)
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a SHB packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '5' (TSB)
             *                  containing HST field
             *                      set to '0' (SINGLE_HOP)
             *                  containing MHL field
             *                      set to '1'
             *                  containing PL field
             *                      set to the length of the included payload
             *              containing a payload
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/COH/BV/02
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.7.4, 8.8.4, 9.3.4 and 9.3.10
             */
            testcase TC_GEONW_FDV_COH_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var GeoNetworkingInd v_geoNwInd;
                var octetstring v_payload := char2oct("PAYLOAD");
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                if ( not f_utTriggerEvent(m_generateShbMessageWithPayload(v_payload)) ) {
                	log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                	f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwShbPacket))) -> value v_geoNwInd {
                        tc_ac.stop;
                        if(ispresent(v_geoNwInd.msgIn.gnPacket.packet.payload)) {
                            if(v_geoNwInd.msgIn.gnPacket.packet.commonHeader.plLength == lengthof(v_geoNwInd.msgIn.gnPacket.packet.payload.rawPayload)) {
                                log("*** " & testcasename() & ": PASS: PL field correctly indicates payload size ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": FAIL: PL does correctly not indicate payload size ("
                                    & int2str(v_geoNwInd.msgIn.gnPacket.packet.commonHeader.plLength)
                                    & " != "
                                    & int2str(lengthof(v_geoNwInd.msgIn.gnPacket.packet.payload.rawPayload))
                                    & ")***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                        }
                        else {
                            if(v_geoNwInd.msgIn.gnPacket.packet.commonHeader.plLength == 0) {
                                log("*** " & testcasename() & ": PASS: PL field correctly indicates empty payload ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": FAIL: PL does not indicate empty payload ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                        }
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_COH_BV_02
            
            /**
             * @desc    Testing defined values of default Gn parameters in the common header
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *       the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet
             *      }
             *      then {
             *          the IUT sends a GeoUnicast packet
             *              containing a correctly formatted Common Header
             *                  containing Flags field
             *                      indicating value equalling the itsGnIsMobile MIB parameter
             *                  containing MHL field
             *                      set to itsGnDefaultHopLimit MIB parameter
             *     }
             *  }
             * </pre>
             *
             * @version 0.0.11
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/COH/BV/03
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.8.2, 9.3.4 and Annex G
             */
            testcase TC_GEONW_FDV_COH_BV_03() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(vc_componentName);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                 
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(
                            mw_geoNwUnicastPacketWithHlAndFlags(?, ?, f_getDefaultHopLimit(), f_isMobile())))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Correct GeoNetworking Common Header received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] a_receiveAnyGeoUnicast() {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Incorrect GeoNetworking Common Header received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_COH_BV_03
            
            group GEONW_FDV_COH_BV_04 {
                
                /**
                 * @desc    Test that a received TSB packet is discarded if received with RHL > MHL
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *       the IUT being in the "initial state" and
                 *       the IUT having received Beacon information from ItsNodeD and
                 *       the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a TSB packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating HL1 higher than MHL1
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating MHL1
                 *      }
                 *      then {
                 *          the IUT discards the TSB packet
                 *     }
                 *  }
                 * </pre>
                 *
                 * @version 0.0.11
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/COH/BV/04
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.5
                 */
                testcase TC_GEONW_FDV_COH_BV_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_FDV_COH_BV_04_nodeB());
                    v_nodeD.start(f_GEONW_FDV_COH_BV_04_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_FDV_COH_BV_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_FDV_COH_BV_04)
                 */
                function f_GEONW_FDV_COH_BV_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var UInt8 v_hopLimit := f_getDefaultHopLimit();
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwTsbPacket(
                                    vc_localSeqNumber,
                                    v_longPosVectorNodeB,
                                    v_hopLimit-1
                                ),
                                -,
                                v_hopLimit
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: TSB packet was not discarded  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: TSB was correctly discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_FDV_COH_BV_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_FDV_COH_BV_04)
                 */
                function f_GEONW_FDV_COH_BV_04_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: TSB packet was not discarded  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: TSB was correctly discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_FDV_COH_BV_04_nodeD
                
            } // end GEONW_FDV_COH_BV_04
            
        } // end geoFdvCommonHeader
        
        // 6.2.1.3
        group geoFdvBeacon {
            
            /**
             * @desc    Beacon header validity test
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT generates a Beacon packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '1' (BEACON)
             *                  containing HST field
             *                      set to '0' (UNSPECIFIED)
             *                  containing NH field
             *                      set to '0' (UNSPECIFIED)
             *              containing Extended Header
             *                  containing SOPV
             *                      indicating LPV of the IUT
             *      }
             *    }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/BEA/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.8.6 and 9.3.6
             */
            testcase TC_GEONW_FDV_BEA_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBeaconPacket(mw_longPosVectorPosition(v_longPosVectorIut), e_any)))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Common Header correclty formatted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_BEA_BV_01
            
            /**
             * @desc    GeoNetworking address validity test
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *    the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT generates a Beacon packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing SOPV field
             *                  containing GN_ADDR field
             *                      containing ST field
             *                          indicating the ITS Station type
             *                      containing SCC field
             *                          indicating the ITS Station country code
             *      }
             *  }
             *  NOTE: Correct Source GeoNetworking address value: itsGnLocalGnAddr MIB parameter value.
             *  
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/BEA/BV/02
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 6.3 and 8.8.6.2
             */
            testcase TC_GEONW_FDV_BEA_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBeaconPacket(
                            mw_longPosVectorAny(f_getIutGnLocalAddress()))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: GN address correctly received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_BEA_BV_02
            
            /**
             * @desc    Local Position Vector validity test, involving comparison against sensor input data
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT generates a Beacon packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correct SOPV field
             *                  indicating the latest position of the IUT
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/BEA/BV/03
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.5.2.2 and 8.8.6.2
             */
            testcase TC_GEONW_FDV_BEA_BV_03() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBeaconPacket(mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Position equaling GN-MNGT primitive value received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_BEA_BV_03
            
            /**
             * @desc    Local Position Vector validity test, involving timestamp comparison against sensor input data
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT generates a Beacon packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correct SOPV field
             *                  indicating the timestamp value corresponding to the sensor acquisition time of position data
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/BEA/BV/04
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.5.2.2 and 8.8.6.2
             */
            testcase TC_GEONW_FDV_BEA_BV_04() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBeaconPacket(mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Timestamp equaling GN-MNGT primitive value received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_BEA_BV_04
            
        } // end geoFdvBeacon
        
        // 6.2.1.4
        group geoFdvGeoUnicast {
            
            /**
             * @desc    GeoUnicast header validity
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '2' (GEOUNICAST)
             *                  containing HST field
             *                      set to '0' (UNSPECIFIED)
             *              containing GeoUnicast Extended Header
             *                  containing DEPV field
             *                      indicating position of the ItsNodeB
             *                  containing SOPV field
             *                      indicating position of the IUT
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/GUC/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.8.2.2 and 9.3.8
             */
            testcase TC_GEONW_FDV_GUC_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                
                // Test adapter configuration
                
                // Preamble
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                v_longPosVectorIut := f_getPosition(c_compIut);
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacketWithSourcePv(
                                        mw_shortPosVectorPosition_withDelta(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)), // DEPV
                                        ?, // sequence number
                                        mw_longPosVectorPosition_withDelta(v_longPosVectorIut) //SOPV
                                    )
                                )
                            )
                        ) {
                        tc_ac.stop;
                        
                        log("*** " & testcasename() & ": PASS: Fields of the received GeoUnicast message correctly set ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: GeoUnicast message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_GUC_BV_01
            
        } // end geoFdvGeoUnicast
        
        // 6.2.1.5
        group geoFdvGeoBroadcast {
            
            /**
             * @desc    GeoBroadcast header validity
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from the ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoBroadcast packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '4' (GEOBROADCAST)
             *              containing GeoBroadcast Extended Header
             *                  containing SOPV field
             *                      indicating position of the IUT
             *       }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/GBC/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.7.4, 8.8.5.2 and 9.3.11
             */
            testcase TC_GEONW_FDV_GBC_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                var octetstring v_payload := char2oct("PAYLOAD");
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                
                // Test adapter configuration
                
                // Preamble
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                v_longPosVectorIut := f_getPosition(c_compIut);
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateGeoBroadcastMessageWithPayload(f_getArea(c_area1), v_payload)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                        f_receiveGeoNetMessageWithPayload(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwBroadcastPacket(
                                        mw_longPosVectorPosition_withDelta(v_longPosVectorIut), // SOPV
                                        ? // sequence number
                                    )
                                )
                            ),
                            ?
                        )
                    ) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Fields of the received GeoBroadcast message correctly set ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_GBC_BV_01
            
        } // end geoFdvGeoBroadcast
        
        // 6.2.1.6
        group geoFdvGeoAnycast {
            
            /**
             * @desc    GeoAnycast header validity
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from the ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoAnycast packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '3' (GEOANYCAST)
             *              containing GeoAnycast Extended Header
             *                  containing SOPV field
             *                      indicating position of IUT
             *       }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/GAC/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.7.4, 8.8.5.2 and 9.3.12
             */
            testcase TC_GEONW_FDV_GAC_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                var octetstring v_payload := char2oct("PAYLOAD");
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                
                // Test adapter configuration
                
                // Preamble
                v_longPosVectorIut := f_getPosition(c_compIut);
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateGeoAnycastMessageWithPayload(f_getArea(c_area1), v_payload)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                        f_receiveGeoNetMessageWithPayload(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwAnycastPacket(
                                        mw_longPosVectorPosition_withDelta(v_longPosVectorIut), // SOPV
                                        ? // sequence number
                                    )
                                )
                            ),
                            ?
                        )
                    ) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Fields of the received GeoAnycast message correctly set ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: GeoAnycast message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_GAC_BV_01
            
        } // end geoFdvGeoAnycast
        
        // 6.2.1.7
        group geoFdvSingleHopBroadcast {
            
            /**
             * @desc    SHB header validity
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from the ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a SHB packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '5' (TSB)
             *                  containing HST field
             *                      set to '0' (SINGLE_HOP)
             *                  containing MHL field
             *                      set to '1'
             *              containing Extended Header
             *                  containing SOPV
             *                      indicating LPV of the IUT
             *       }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/SHB/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.7.4, 9.3.4, 8.8.4.2 and 9.3.10
             */
            testcase TC_GEONW_FDV_SHB_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                
                // Test adapter configuration
                
                // Preamble
                v_longPosVectorIut := f_getPosition(c_compIut);
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateShbMessage) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwShbPacket(
                                      mw_longPosVectorPosition_withDelta(v_longPosVectorIut), // SOPV
                                      1 //MHL
                                    )
                                )
                            )
                        ) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Fields of the received SHB message correctly set ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: SHB message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_SHB_BV_01
            
        } // end geoFdvSingleHopBroadcast
        
        // 6.2.1.8
        group geoFdvTopologicallyScopedBroadcast {
            
            /**
             * @desc    TSB header validity
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from the ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a TSB packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '5' (TSB)
             *                  containing HST field
             *                      set to '1' (MULTI_HOP)
             *              containing TSB Extended Header
             *                  containing SOPV field
             *                      indicating position of the IUT
             *       }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/FDV/TSB/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 8.7.2, 8.7.4, 8.8.3.2 and 9.3.9
             */
            testcase TC_GEONW_FDV_TSB_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                
                // Test adapter configuration
                
                // Preamble
                v_longPosVectorIut := f_getPosition(c_compIut);
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateTsbMessage) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                           mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwTsbPacket(
                                        ?, // sequence number
                                        mw_longPosVectorPosition_withDelta(v_longPosVectorIut) // SOPV
                                    )
                                )
                            )
                        ) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: message received with correct common and extended headers ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: TSB message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_FDV_TSB_BV_01
            
        } // end geoFdvTopologicallyScopedBroadcast
        
    } // end geoFormatingAndDataValidity
    
    // 6.2.2
    group geoProtocolOperation {
        
        // 6.2.2.1
        group geoLocationTable {
            
            /**
             * @desc    Test of adding new entries into location table from Beacon header
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from the ItsNodeB and
             *      the lifetime of the ItsNodeB Location Table entry not being expired
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
             *      }
             *      then {
             *          the IUT does not send a GeoNetworking packet
             *              containing a LS_REQUEST
             *                  containing Request field
             *                      containing GN_ADDR
             *                          containing M_ID
             *                              indicating ItsNodeB
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '2' (GEOUNICAST)
             *              containing GeoUnicast Extended Header
             *                  containing DEPV field
             *                      indicating same position as the SOPV value of the Beacon information received from ItsNodeB
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/01
             * @reference   EN 302 636-4-1 [1], clauses 9.3.10.3, 9.3.6.2 and 9.3.8.2
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOT_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: GeoUnicast packet received correctly ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] a_receiveAnyLsRequest() {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received Location Service Request ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": TIMEOUT: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                    
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOT_BV_01
            
            /**
             * @desc    Test of adding new entries into location table from LS Reply data
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having been requested to send a first GeoUnicast packet to ItsNodeA and
             *      the IUT having sent a LS_REQUEST packet
             *          containing Request field
             *              containing GN_ADDR
             *                  containing M_ID
             *                      indicating ItsNodeA
             *      the IUT having received a LS_REPLY packet from ItsNodeA
             *          containing SOPV field and
             *      the IUT having sent the GeoUnicast packet to ItsNodeA and
             *      the lifetime of the ItsNodeA Location Table entry not being expired
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a second GeoUnicast packet to ItsNodeA
             *      }
             *      then {
             *          the IUT does not send a GeoNetworking packet
             *              containing a LS_REQUEST
             *                  containing Request field
             *                      containing GN_ADDR
             *                          containing M_ID
             *                              indicating ItsNodeA
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '2' (GEOUNICAST)
             *              containing GeoUnicast Extended Header
             *                  containing DEPV field
             *                      indicating same position as the SOPV value of the LS_REPLY packet received from ItsNodeA
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/02
             * @reference   EN 302 636-4-1 [1], clauses 9.3.7.1.4, 9.3.7.1.2 and 9.3.8.2
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOT_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                var GN_Address v_gnAddressNodeA;
                var boolean v_lsRequestReceived := false;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                v_gnAddressNodeA := v_longPosVectorNodeA.gnAddr;
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                
                if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequestAndReply(
                            ?, v_gnAddressNodeA.mid,
                            v_longPosVectorNodeA, v_longPosVectorNodeB
                        ) {
                        v_lsRequestReceived := true;
                        log("*** " & testcasename() & ": Pre-conditions: Received and answered Location Service Request ***");
                        repeat;
                    }
                    [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA))) {
                        tc_ac.stop;
                        if(v_lsRequestReceived == true) {
                            log("*** " & testcasename() & ": Pre-conditions: First GeoUnicast message received correctly ***");
                        }
                        else {
                            log("*** " & testcasename() & ": Pre-conditions: GeoUnicast packet received without LS Request ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Pre-conditions: Initial conditions not satisfied. ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_gnAddressNodeA.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received Location Service Request ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Received second GeoUnicast packet without LS Request ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOT_BV_02
            
            group GEONW_PON_LOT_BV_03 {
                
                /**
                 * @desc    Test of adding new entries into location table from extended header processing
                 *          (e.g. Unicast header)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a MESSAGE from ItsNodeA
                 *  }
                 *  MESSAGE: Beacon packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating ItsNodeA
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV of the MESSAGE received from ItsNodeA
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/03
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.9.3, 9.3.10.3, 9.3.7.3 and 9.3.8.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_03_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_TP_GEONW_PON_LOT_BV_03_pre_1();
                    
                    f_TP_GEONW_PON_LOT_BV_03_pre_2(
                        m_geoNwBeaconPacket(
                            v_longPosVectorNodeA
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_03_main(v_longPosVectorNodeA);
                    
                } // end TC_GEONW_PON_LOT_BV_03_01
                
                /**
                 * @desc    Test of adding new entries into location table from extended header processing
                 *          (e.g. Unicast header)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a MESSAGE from ItsNodeA
                 *  }
                 *  MESSAGE: GUC packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating ItsNodeA
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV of the MESSAGE received from ItsNodeA
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/03
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.9.3, 9.3.10.3, 9.3.7.3 and 9.3.8.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_03_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_TP_GEONW_PON_LOT_BV_03_pre_1();
                    
                    f_TP_GEONW_PON_LOT_BV_03_pre_2(
                        m_geoNwUnicastPacket(
                            v_longPosVectorNodeA,
                            f_getIutShortPosVector(),
                            vc_localSeqNumber
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_03_main(v_longPosVectorNodeA);
                    
                } // end TC_GEONW_PON_LOT_BV_03_02
                
                /**
                 * @desc    Test of adding new entries into location table from extended header processing
                 *          (e.g. Unicast header)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a MESSAGE from ItsNodeA
                 *  }
                 *  MESSAGE: GAC packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating ItsNodeA
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV of the MESSAGE received from ItsNodeA
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/03
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.9.3, 9.3.10.3, 9.3.7.3 and 9.3.8.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_03_03() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_TP_GEONW_PON_LOT_BV_03_pre_1();
                    
                    f_TP_GEONW_PON_LOT_BV_03_pre_2(
                        m_geoNwAnycastPacket(
                            v_longPosVectorNodeA,
                            vc_localSeqNumber,
                            f_getGeoAnycastArea(c_area1)
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_03_main(v_longPosVectorNodeA);
                    
                } // end TC_GEONW_PON_LOT_BV_03_03
                
                /**
                 * @desc    Test of adding new entries into location table from extended header processing
                 *          (e.g. Unicast header)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a MESSAGE from ItsNodeA
                 *  }
                 *  MESSAGE: GBC packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating ItsNodeA
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV of the MESSAGE received from ItsNodeA
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/03
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.9.3, 9.3.10.3, 9.3.7.3 and 9.3.8.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_03_04() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_TP_GEONW_PON_LOT_BV_03_pre_1();
                    
                    f_TP_GEONW_PON_LOT_BV_03_pre_2(
                        m_geoNwBroadcastPacket(
                            v_longPosVectorNodeA,
                            vc_localSeqNumber,
                            f_getGeoBroadcastArea(c_area1)
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_03_main(v_longPosVectorNodeA);
                    
                } // end TC_GEONW_PON_LOT_BV_03_04
                
                /**
                 * @desc    Test of adding new entries into location table from extended header processing
                 *          (e.g. Unicast header)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a MESSAGE from ItsNodeA
                 *  }
                 *  MESSAGE: TSB packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating ItsNodeA
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV of the MESSAGE received from ItsNodeA
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/03
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.9.3, 9.3.10.3, 9.3.7.3 and 9.3.8.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_03_05() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_TP_GEONW_PON_LOT_BV_03_pre_1();
                    
                    f_TP_GEONW_PON_LOT_BV_03_pre_2(
                        m_geoNwTsbPacket(
                            vc_localSeqNumber,
                            v_longPosVectorNodeA
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_03_main(v_longPosVectorNodeA);
                    
                } // end TC_GEONW_PON_LOT_BV_03_05
                
                /**
                 * @desc    Test of adding new entries into location table from extended header processing
                 *          (e.g. Unicast header)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a MESSAGE from ItsNodeA
                 *  }
                 *  MESSAGE: SHB packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating ItsNodeA
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV of the MESSAGE received from ItsNodeA
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/03
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.9.3, 9.3.10.3, 9.3.7.3 and 9.3.8.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_03_06() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_TP_GEONW_PON_LOT_BV_03_pre_1();
                    
                    f_TP_GEONW_PON_LOT_BV_03_pre_2(
                        m_geoNwShbPacket(
                            v_longPosVectorNodeA
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_03_main(v_longPosVectorNodeA);
                    
                } // end TC_GEONW_PON_LOT_BV_03_06
                
                /**
                 * @desc    Test of adding new entries into location table from extended header processing
                 *          (e.g. Unicast header)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a MESSAGE from ItsNodeA
                 *  }
                 *  MESSAGE: LS Request packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating ItsNodeA
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV of the MESSAGE received from ItsNodeA
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/03
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.9.3, 9.3.10.3, 9.3.7.3 and 9.3.8.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_03_07() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_TP_GEONW_PON_LOT_BV_03_pre_1();
                    
                    activate(a_receiveAnyLsReply());
                    
                    f_TP_GEONW_PON_LOT_BV_03_pre_2(
                        m_geoNwLsRequestPacket(
                            v_longPosVectorNodeA,
                            vc_localSeqNumber,
                            f_getIutGnLocalAddress()
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_03_main(v_longPosVectorNodeA);
                    
                } // end TC_GEONW_PON_LOT_BV_03_07
                
                /**
                 * @desc    Test of adding new entries into location table from extended header processing
                 *          (e.g. Unicast header)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a MESSAGE from ItsNodeA
                 *  }
                 *  MESSAGE: LS Reply packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating ItsNodeA
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV of the MESSAGE received from ItsNodeA
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/03
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.9.3, 9.3.10.3, 9.3.7.3 and 9.3.8.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_03_08() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_TP_GEONW_PON_LOT_BV_03_pre_1();
                    
                    f_TP_GEONW_PON_LOT_BV_03_pre_2(
                        m_geoNwLsReplyPacket(
                            v_longPosVectorNodeA,
                            f_getIutShortPosVector(),
                            vc_localSeqNumber
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_03_main(v_longPosVectorNodeA);
                    
                } // end TC_GEONW_PON_LOT_BV_03_08
                
                /**
                 * @desc    Function including first preamble part (TC_GEONW_PON_LOT_BV_03)
                 */
                function f_TP_GEONW_PON_LOT_BV_03_pre_1() runs on ItsGeoNetworking return LongPosVector {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf01Up();
                    v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Test adapter configuration
                    
                    // Preamble part I
                    f_prNeighbour();
                    
                    return v_longPosVectorNodeA;
                } // end f_TP_GEONW_PON_LOT_BV_03_pre_1
                
                /**
                 * @desc    Function including second preamble part (TC_GEONW_PON_LOT_BV_03)
                 */
                function f_TP_GEONW_PON_LOT_BV_03_pre_2(in template (value) GnNonSecuredPacket p_packet) runs on ItsGeoNetworking {
                    
                    //preamble part II
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(p_packet))
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                } // end f_TP_GEONW_PON_LOT_BV_03_pre_2
                
                /**
                 * @desc    Function including test body and postamble part (TC_GEONW_PON_LOT_BV_03)
                 */
                function f_TP_GEONW_PON_LOT_BV_03_main(in template (value) LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Test Body
                    if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(valueof(p_longPosVectorNodeA.gnAddr))) ) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveAnyLsRequest() {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: Received Location Service Request ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(valueof(p_longPosVectorNodeA)))) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoUnicast packet received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                        
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                    
                } // end f_TP_GEONW_PON_LOT_BV_03_main
                
            } //end GEONW_PON_LOT_BV_03
            
            /**
             * @desc    Test of handling entries expiring from location table
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacons information from ItsNodeB and
             *      the IUT not having received beacons from ItsNodeB for the duration of itsGnLifetimeLocTE parameter (20 sec)
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a LS_REQUEST
             *                  containing Request field
             *                      indicating GN_ADDR of ItsNodeB
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/04
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 7.1.3, 9.3.8.2, 9.3.7.1.2 and Annex G
             */
            testcase TC_GEONW_PON_LOT_BV_04() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Preamble
                f_prDefault(); // NodeB will send Beacon only once
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(m_geoNwBeaconPacket(f_getPosition(c_compNodeB)), -, c_hopLimit1)));
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                f_sleep(f_getLifetimeLocTableEntry());
                if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeB.gnAddr.mid, v_longPosVectorIut ) {
                        log("*** " & testcasename() & ": PASS: LS Request received correctly ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: LS Request not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poDefault();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOT_BV_04
            
            group GEONW_PON_LOT_BV_05 {
                
                /**
                 * @desc    Test of updating entries in location table with most up-to-date position data extracted
                 *          from common header processing (including timestamp comparison before updating)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a MESSAGE from ItsNodeB,
                 *          containing Extended Header
                 *              containing SOPV field
                 *                  indicating an older timestamp than the last Beacon packet and
                 *                  indicating a different position than the position of the last Beacon packet
                 *  }
                 *  MESSAGE: GUC packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST
                 *                  containing Request field
                 *                      indicating GN_ADDR of ItsNodeB
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV value of the Beacon information received
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/05
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.11.3, 9.3.9.3, 9.3.7.3, 9.3.8.2 and Annex C2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_05_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB;
                    var LongPosVector v_obsoleteLongPosVectorNodeB;
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_1(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_2(
                        m_geoNwUnicastPacket(
                            v_obsoleteLongPosVectorNodeB,
                            f_getIutShortPosVector(),
                            vc_localSeqNumber
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_05_main(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                } // end TC_GEONW_PON_LOT_BV_05_01
                
                /**
                 * @desc    Test of updating entries in location table with most up-to-date position data extracted
                 *          from common header processing (including timestamp comparison before updating)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a MESSAGE from ItsNodeB,
                 *          containing Extended Header
                 *              containing SOPV field
                 *                  indicating an older timestamp than the last Beacon packet and
                 *                  indicating a different position than the position of the last Beacon packet
                 *  }
                 *  MESSAGE: GAC packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST
                 *                  containing Request field
                 *                      indicating GN_ADDR of ItsNodeB
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV value of the Beacon information received
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/05
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.11.3, 9.3.9.3, 9.3.7.3, 9.3.8.2 and Annex C2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_05_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB;
                    var LongPosVector v_obsoleteLongPosVectorNodeB;
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_1(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_2(
                        m_geoNwAnycastPacket(
                            v_obsoleteLongPosVectorNodeB,
                            vc_localSeqNumber,
                            f_getGeoAnycastArea(c_area1)
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_05_main(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                } // end TC_GEONW_PON_LOT_BV_05_02
                
                /**
                 * @desc    Test of updating entries in location table with most up-to-date position data extracted
                 *          from common header processing (including timestamp comparison before updating)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a MESSAGE from ItsNodeB,
                 *          containing Extended Header
                 *              containing SOPV field
                 *                  indicating an older timestamp than the last Beacon packet and
                 *                  indicating a different position than the position of the last Beacon packet
                 *  }
                 *  MESSAGE: GBC packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST
                 *                  containing Request field
                 *                      indicating GN_ADDR of ItsNodeB
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV value of the Beacon information received
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/05
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.11.3, 9.3.9.3, 9.3.7.3, 9.3.8.2 and Annex C2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_05_03() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB;
                    var LongPosVector v_obsoleteLongPosVectorNodeB;
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_1(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_2(
                        m_geoNwBroadcastPacket(
                            v_obsoleteLongPosVectorNodeB,
                            vc_localSeqNumber,
                            f_getGeoBroadcastArea(c_area1)
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_05_main(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                } // end TC_GEONW_PON_LOT_BV_05_03
                
                /**
                 * @desc    Test of updating entries in location table with most up-to-date position data extracted
                 *          from common header processing (including timestamp comparison before updating)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a MESSAGE from ItsNodeB,
                 *          containing Extended Header
                 *              containing SOPV field
                 *                  indicating an older timestamp than the last Beacon packet and
                 *                  indicating a different position than the position of the last Beacon packet
                 *  }
                 *  MESSAGE: TSB packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST
                 *                  containing Request field
                 *                      indicating GN_ADDR of ItsNodeB
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV value of the Beacon information received
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/05
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.11.3, 9.3.9.3, 9.3.7.3, 9.3.8.2 and Annex C2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_05_04() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB;
                    var LongPosVector v_obsoleteLongPosVectorNodeB;
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_1(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_2(
                        m_geoNwTsbPacket(
                            vc_localSeqNumber,
                            v_obsoleteLongPosVectorNodeB
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_05_main(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                } // end TC_GEONW_PON_LOT_BV_05_04
                
                /**
                 * @desc    Test of updating entries in location table with most up-to-date position data extracted
                 *          from common header processing (including timestamp comparison before updating)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a MESSAGE from ItsNodeB,
                 *          containing Extended Header
                 *              containing SOPV field
                 *                  indicating an older timestamp than the last Beacon packet and
                 *                  indicating a different position than the position of the last Beacon packet
                 *  }
                 *  MESSAGE: SHB packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST
                 *                  containing Request field
                 *                      indicating GN_ADDR of ItsNodeB
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV value of the Beacon information received
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/05
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.11.3, 9.3.9.3, 9.3.7.3, 9.3.8.2 and Annex C2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_05_05() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB;
                    var LongPosVector v_obsoleteLongPosVectorNodeB;
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_1(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_2(
                        m_geoNwShbPacket(
                            v_obsoleteLongPosVectorNodeB
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_05_main(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                } // end TC_GEONW_PON_LOT_BV_05_05
                
                /**
                 * @desc    Test of updating entries in location table with most up-to-date position data extracted
                 *          from common header processing (including timestamp comparison before updating)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a MESSAGE from ItsNodeB,
                 *          containing Extended Header
                 *              containing SOPV field
                 *                  indicating an older timestamp than the last Beacon packet and
                 *                  indicating a different position than the position of the last Beacon packet
                 *  }
                 *  MESSAGE: LS Request packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST
                 *                  containing Request field
                 *                      indicating GN_ADDR of ItsNodeB
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV value of the Beacon information received
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/05
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.11.3, 9.3.9.3, 9.3.7.3, 9.3.8.2 and Annex C2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_05_06() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB;
                    var LongPosVector v_obsoleteLongPosVectorNodeB;
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_1(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                    activate(a_receiveAnyLsReply());
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_2(
                        m_geoNwLsRequestPacket(
                            v_obsoleteLongPosVectorNodeB,
                            vc_localSeqNumber,
                            f_getIutGnLocalAddress()
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_05_main(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                } // end TC_GEONW_PON_LOT_BV_05_06
                
                /**
                 * @desc    Test of updating entries in location table with most up-to-date position data extracted
                 *          from common header processing (including timestamp comparison before updating)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF01
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a MESSAGE from ItsNodeB,
                 *          containing Extended Header
                 *              containing SOPV field
                 *                  indicating an older timestamp than the last Beacon packet and
                 *                  indicating a different position than the position of the last Beacon packet
                 *  }
                 *  MESSAGE: LS Reply packet
                 *
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
                 *      }
                 *      then {
                 *          the IUT does not send a GeoNetworking packet
                 *              containing a LS_REQUEST
                 *                  containing Request field
                 *                      indicating GN_ADDR of ItsNodeB
                 *          the IUT sends a GeoNetworking packet
                 *              containing a correctly formatted Common Header
                 *                  containing HT field
                 *                      set to '2' (GEOUNICAST)
                 *              containing GUC Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV value of the Beacon information received
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOT/BV/05
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.12.3, 9.3.11.3, 9.3.9.3, 9.3.7.3, 9.3.8.2 and Annex C2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOT_BV_05_07() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB;
                    var LongPosVector v_obsoleteLongPosVectorNodeB;
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_1(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                    f_TP_GEONW_PON_LOT_BV_05_pre_2(
                        m_geoNwLsReplyPacket(
                            v_obsoleteLongPosVectorNodeB,
                            f_getIutShortPosVector(),
                            vc_localSeqNumber
                        )
                    );
                    
                    f_TP_GEONW_PON_LOT_BV_05_main(v_longPosVectorNodeB, v_obsoleteLongPosVectorNodeB);
                    
                } // end TC_GEONW_PON_LOT_BV_05_07
                
                /**
                 * @desc    Function including first preamble part (TC_GEONW_PON_LOT_BV_05)
                 */
                function f_TP_GEONW_PON_LOT_BV_05_pre_1(out LongPosVector p_longPosVectorNodeB, out LongPosVector p_obsoleteLongPosVectorNodeB) runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf01Up();
                    p_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    p_obsoleteLongPosVectorNodeB := p_longPosVectorNodeB;
                    p_obsoleteLongPosVectorNodeB.timestamp := p_obsoleteLongPosVectorNodeB.timestamp - 1000;
                    p_obsoleteLongPosVectorNodeB.latitude := p_obsoleteLongPosVectorNodeB.latitude - 1;
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prDefault();
                    
                    // Act as a neighbor and send one beacon
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(m_geoNwBeaconPacket(f_getPosition(c_compNodeB)), -, c_hopLimit1)));
                } // end f_TP_GEONW_PON_LOT_BV_05_pre_1
                
                /**
                 * @desc    Function including second preamble part (TC_GEONW_PON_LOT_BV_05)
                 */
                function f_TP_GEONW_PON_LOT_BV_05_pre_2(in template (value) GnNonSecuredPacket p_packet) runs on ItsGeoNetworking {
                    
                    //preamble part II
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(p_packet))
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                } // end f_TP_GEONW_PON_LOT_BV_05_pre_2
                
                /**
                 * @desc    Function including test body and postamble part (TC_GEONW_PON_LOT_BV_05)
                 */
                function f_TP_GEONW_PON_LOT_BV_05_main(in template (value) LongPosVector p_longPosVectorNodeB, in template (value) LongPosVector p_obsoleteLongPosVectorNodeB) runs on ItsGeoNetworking {
                    
                    // Test Body
                    if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(valueof(p_longPosVectorNodeB.gnAddr)))) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveAnyLsRequest() {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: Received Location Service Request ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(valueof(p_obsoleteLongPosVectorNodeB)))) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoUnicast received with obsolete Destination Position Vector ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(valueof(p_longPosVectorNodeB)))) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoUnicast packet received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    f_cf01Down();
                    
                } // end f_TP_GEONW_PON_LOT_BV_05_main
                
            } // end group GEONW_PON_LOT_BV_05
            
        } // end geoLocationTable
        
        // 6.2.2.2
        group geoLocalPositionVector {
            
            /**
             * @desc    Test of the updating of the Local position vector
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having changed its position
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT generates eventually a Beacon packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '1' (BEACON)
             *                  containing HST field
             *                      set to '0' (UNSPECIFIED)
             *                  containing Extended Header
             *                      containing SOPV field
             *                          indicating the new position
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LPV/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 7.2.3, 9.2.2.2, 9.3.6.1 and Annex G
             */
            testcase TC_GEONW_PON_LPV_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                var template LongPosVector v_previouslongPosVectorIut;
                var GeoNetworkingInd v_geoNwInd;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                v_previouslongPosVectorIut := v_longPosVectorIut;
                v_previouslongPosVectorIut.timestamp := ?;
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(
                            mw_geoNwBeaconPacket(
                                mw_longPosVectorAny(v_longPosVectorIut.gnAddr)
                            )
                        ))) -> value v_geoNwInd {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": Pre-conditions: Beacon received ***");
                        v_longPosVectorIut := v_geoNwInd.msgIn.gnPacket.packet.extendedHeader.beaconHeader.srcPosVector;
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Pre-conditions: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                f_utChangePosition();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                geoNetworkingPort.clear;
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(
                            mw_geoNwBeaconPacket(
                                mw_longPosVectorAny(v_longPosVectorIut.gnAddr)
                            )
                        ))) -> value v_geoNwInd {
                        tc_ac.stop;
                        //check if the position vector has changed
                        if (match(v_geoNwInd.msgIn.gnPacket.packet.extendedHeader.beaconHeader.srcPosVector, v_previouslongPosVectorIut)) {
                            log("*** " & testcasename() & ": FAIL: Sender Postion Vector not correctly updated ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": PASS: Sender Postion Vector correctly updated ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                f_acTriggerEvent(m_stopPassBeaconing);
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LPV_BV_01
            
        } // end geoLocalPositionVector
        
        // 6.2.2.3
        group geoSequenceNumber {
            
            /**
             * @desc    Test of the initial sequence number assignment
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT not having sent any GUC and
filatov's avatar
filatov committed
             *      the IUT having received Beacon information from ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '2' (GEOUNICAST)
             *                  containing HST field
             *                      set to '0' (UNSPECIFIED)
             *              containing GeoUnicast Extended Header
             *                  containing SN field
             *                      indicating value '0'
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/SQN/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 7.2.3, 9.3.8.2
             */
            testcase TC_GEONW_PON_SQN_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var UInt16 v_expectedSequenceNumber := 0;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveGeoUnicast(mw_shortPosVectorPosition_anyPos(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)), v_expectedSequenceNumber) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: GeoUnicast packet received correctly ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] a_receiveGeoUnicast(mw_shortPosVectorPosition_anyPos(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)), ?) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: GeoUnicast packet received with incorrect sequence number ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_SQN_BV_01
            
            /**
             * @desc    Test of the local sequence number incrementing
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from ItsNodeB and
             *      the IUT having sent a GeoUnicast packet to the ItsNodeB
             *          containing the Sequence Number field
             *              indicating value SN1
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '2' (GEOUNICAST)
             *              containing GeoUnicast Extended Header
             *                  containing SN field
             *                      indicating value SN1 + 1
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/SQN/BV/02
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 7.2.3, 9.3.8.2
             */
            testcase TC_GEONW_PON_SQN_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var UInt16 v_expectedSequenceNumber := 0;
                var integer v_nbReceivedPackets := 0;
                var GeoNetworkingInd v_geoNwInd;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_sleep(10.0);
                // receive first packet
                if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwUnicastPacket(
                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)),
                            ?)))) -> value v_geoNwInd {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": Pre-conditions: First GeoUnicast packet received  ***");
                        v_expectedSequenceNumber := v_geoNwInd.msgIn.gnPacket.packet.extendedHeader.geoUnicastHeader.seqNumber + 1;
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Pre-conditions: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] a_receiveGeoUnicast(mw_shortPosVectorPosition_anyPos(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)), v_expectedSequenceNumber) {
                        tc_ac.stop;
                        v_nbReceivedPackets := v_nbReceivedPackets + 1;
                        if(v_nbReceivedPackets >= vc_multipleMessagesCount) {
                            log("*** " & testcasename() & ": PASS: GeoUnicast packets received with correct sequence numbers ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        else {
                            v_expectedSequenceNumber := v_expectedSequenceNumber + 1;
				            if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
				                log("*** " & testcasename() & ": INCONC: Trigger failed ***");
				                f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
				            }
                            tc_ac.start;
                            repeat;
                        }
                    }
                    [] a_receiveGeoUnicast(mw_shortPosVectorPosition_anyPos(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)), ?) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: GeoUnicast packet received with incorrect sequence number ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_SQN_BV_02
        
        } // end geoSequenceNumber
        
        // 6.2.2.4
        group geoLocationService {
            
            /**
             * @desc    Test of first LS invocation for unknown Destination nodes
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '6' (LS)
             *                  containing HST field
             *                      set to '0' (LS_REQUEST)
             *                  containing NH field
             *                      set to '0' (UNSPECIFIED)
             *              containing LS_REQUEST Extended Header
             *                  containing Request field
             *                      indicating GN_ADDR of ItsNodeA
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/01
             * @reference   EN 302 636-4-1 [1], clauses 9.3.8.2, 9.2.4, 6.3 and 9.3.7.1.2
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOS_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                var GN_Address v_gnAddressNodeA;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_gnAddressNodeA := f_getPosition(c_compNodeA).gnAddr;
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_gnAddressNodeA)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(
                            ?,
                            v_gnAddressNodeA.mid,
                            v_longPosVectorIut
                        ) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: LS Request received correctly ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] a_receiveAnyLsRequest() {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: LS Request does not contain GN Address of nodeA ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_01
            
            /**
             * @desc    Test of no LS invocation for unknown Destination nodes when LS procedure is already active
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send a first GeoUnicast packet to ItsNodeA and
             *      the IUT having sent a GeoNetworking packet
             *          containing a LS_REQUEST
             *              containing Request field
             *                  containing GN_ADDR
             *                      containing M_ID
             *                          indicating ItsNodeA
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *            the IUT is requested to send a new GeoUnicast packet to ItsNodeA
             *      }
             *      then {
             *          IUT does not send a second LS_REQUEST packet (see note)
             *      }
             *  }
             *  NOTE: at least not before the LS_REQUEST retransmission timer expires
             *  
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/02
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.8.2, 9.2.4 and 9.3.7.1.2
             */
            testcase TC_GEONW_PON_LOS_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                var GN_Address v_gnAddressNodeA;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_gnAddressNodeA := f_getPosition(c_compNodeA).gnAddr;
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_gnAddressNodeA)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_gnAddressNodeA.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        //start retransmission timer
                        tc_ac.start(f_getLsRetransmitTimer() - f_getDeltaTimer());
                    }
                }
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                 if ( not  f_utTriggerEvent(m_generateGeoUnicastMessage(v_gnAddressNodeA)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                alt {                    
                    [] a_receiveLsRequest(?, v_gnAddressNodeA.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": Second LS_REQUEST received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": No second LS_REQUEST received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_02
            
            /**
             * @desc    Test of packet buffering into LS buffer during Location service procedure,
             *          including handling of LT fields in the LT packet buffer
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send a GeoUnicast packet to ItsNodeA
             *          containing TrafficClass.SCF set to 1 and
             *      the IUT having sent a LS_REQUEST packet
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives the LS_REPLY packet from ItsNodeA
             *      }
             *      then {
             *          the IUT sends the GeoUnicast packet addressed to ItsNodeA
             *              containing GeoUnicast Extended Header
             *                  containing LT field
             *                      indicating value (default LT value – WaitingTime (see note))
             *      }
             *  }
             *  NOTE: Waiting Time == time difference between LS_REQUEST sending and LS_REPLY reception.
             *  
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/03
             * @reference   EN 302 636-4-1 [1], clauses 7.4.3, 9.3.7.1.4, 9.3.8.2, 9.2.4 and 9.3.7.1.2
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOS_BV_03() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var GeoNetworkingInd v_geoNetInd;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                    }
                }
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                f_sendGeoNetMessage(
                    m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(
                            m_geoNwLsReplyPacket(
                                v_longPosVectorNodeA,
                                f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                vc_localSeqNumber
                            )
                        )
                    )
                );
                
                tc_ac.start;
                alt {
                    
                    [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) -> value v_geoNetInd {
                        tc_ac.stop;
                        //we only check that the lifetime is less than the default lifetime due to
                        //we do not know exactly the time passed at IUT
                        if (f_getLifetimeValue(v_geoNetInd.msgIn.basicHeader.lifeTime)<f_getMaxPacketLifeTime()) {
                            log("*** " & testcasename() & ": Lifetime was handled properly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": Lifetime was not handled properly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_03
            
            /**
             * @desc    Test of LS buffer characteristics: FIFO type
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send a GeoUnicast packet to ItsNodeA
             *          containing TrafficClass.SCF set to 1 
             *          containing LT field
             *              indicating value LT1
             *          containing payload field
             *              indicating value PL1 and
             *      the IUT having sent a LS_REQUEST packet and
             *      the IUT having been requested to send a second GeoUnicast packet to ItsNodeA
             *          containing TrafficClass.SCF set to 1
             *          containing LT field
             *              indicating LT2
             *          containing payload field
             *              indicating value PL2
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives the LS_REPLY packet from ItsNodeA and
             *          before expiry of LT1 and LT2
             *      }
             *      then {
             *          the IUT sends GeoUnicast packet addressed to ItsNodeA
             *              containing payload field
             *                  indicating value PL1 and
             *          the IUT sends GeoUnicast packet addressed to ItsNodeA
             *              containing payload field
             *                  indicating value PL2
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/04
             * @reference   EN 302 636-4-1 [1], clauses 7.4.3, 9.3.8.2, 9.2.4 and 9.3.7.1.2
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOS_BV_04() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var octetstring v_payload1 := char2oct("PAYLOAD_1");
                var octetstring v_payload2 := char2oct("PAYLOAD_2");
                var boolean v_msg1Received := false;
                var boolean v_msg2Received := false;
                var boolean v_firstLsRequestReceived := false;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithPayload(v_longPosVectorNodeA.gnAddr, v_payload1)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        if ( v_firstLsRequestReceived == true ) {
                            log("*** " & testcasename() & ": Second LsRequest received ***");
                            tc_ac.stop;
                            f_sendGeoNetMessage ( m_geoNwReq_linkLayerBroadcast(
                                                    m_geoNwPdu (
                                                        m_geoNwLsReplyPacket(
                                                            v_longPosVectorNodeA,
                                                            f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                                            vc_localSeqNumber ) ) ) );
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": First LsRequest received ***");
                            v_firstLsRequestReceived := true;
                            if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithPayload(v_longPosVectorNodeA.gnAddr, v_payload2)) ) {
                                log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                                f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                            }
                            tc_ac.start;
                            repeat;
                        }
                    }
                    [] tc_ac.timeout{
                        log("*** " & testcasename() & ": Pre-conditions: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Test Body
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                        f_receiveGeoNetMessageWithPayload(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            ),
                            f_adaptPayload_mw(v_payload1)
                        )
                    ) {
                        v_msg1Received := true;
                        if ( v_msg2Received ) {
                            log("*** " & testcasename() & ": FAIL: Messages received in incorrect order ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": First Message received ***");
                            repeat;
                        }
                    }
                    [] geoNetworkingPort.receive(
                        f_receiveGeoNetMessageWithPayload(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            ),
                            f_adaptPayload_mw(v_payload2)
                        )
                    ) {
                        v_msg2Received := true;
                        if ( v_msg1Received ) {
                            log("*** " & testcasename() & ": PASS: Messages received in correct order ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": Second Message received ***");
                            repeat;
                        }
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Expected messages not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_04
            
            /**
             * @desc    Test of LS buffer characteristics: discarding upon LT expiration
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send multiple GeoUnicast packets to ItsNodeA
             *          containing TrafficClass.SCF set to 1
             *          containing LT field
             *              indicating values LTx and
             *      the IUT having sent a LS_REQUEST packet
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives the LS_REPLY packet from ItsNodeA after expiry of LTs
             *      }
             *      then {
             *          the IUT does not send any packet to ItsNodeA
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/05
             * @reference   EN 302 636-4-1 [1], clauses 7.4.3, 9.3.8.2, 9.2.4 and 9.3.7.1.2
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOS_BV_05() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var octetstring v_payload1 := char2oct("PAYLOAD_1");
                var octetstring v_payload2 := char2oct("PAYLOAD_2");
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithPayload(v_longPosVectorNodeA.gnAddr, v_payload1)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithPayload(v_longPosVectorNodeA.gnAddr, v_payload2)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        //start retransmission timer
                        tc_ac.start(f_getMaxPacketLifeTime() + f_getDeltaTimer());
                    }
                    [] tc_ac.timeout{
                        log("*** " & testcasename() & ": Pre-conditions: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Test Body
                // Awaiting expiration of LT
                alt {
                    [] tc_ac.timeout {
                        // LT expired
                    }
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        // retransmitted LS_REQUEST
                        repeat;
                    }
                }
                
                f_sendGeoNetMessage(
                    m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(
                            m_geoNwLsReplyPacket(
                                v_longPosVectorNodeA,
                                f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                vc_localSeqNumber
                            )
                        )
                    )
                );
                
                // Check for messages send to Tester
                tc_noac.start;
                alt {
                    [] geoNetworkingPort.receive (mw_geoNwInd(mw_geoNwPdu(?))){
                        tc_noac.stop;
                        log("*** " & testcasename() & ": Message received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_noac.timeout {
                        log("*** " & testcasename() & ": No message received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_05
            
            /**
             * @desc    Test of LS Request retransmission if no answer is received
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send a GeoUnicast packet to ItsNodeA
             *          containing TrafficClass.SCF set to 1
             *          containing LT field
             *              indicating value LT1 higher than itsGnLocationServiceTimer and
             *      the IUT having sent a LS_REQUEST packet
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT does not receive LS_REPLY packet from ItsNodeA and
             *          before expiration of LT1
             *      }
             *      then {
             *          the IUT retransmits the LS_REQUEST packet
             *              upon expiry of itsGnLocationServiceTimer
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/06
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.7.1.3, 9.3.7.1.2 and 9.3.8.2
             */
            testcase TC_GEONW_PON_LOS_BV_06() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var integer v_maxNbrRetrans := f_getLsMaxRetrans();
                var integer v_rtc := 0;
                var boolean v_retransmitOk := false;
                timer t_minRetrans :=  f_getLsRetransmitTimer() - f_getDeltaTimer();
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithLifetime(v_longPosVectorNodeA.gnAddr, float2int(int2float(v_maxNbrRetrans + 2) * f_getLsRetransmitTimer() * 1000.0))) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                    
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        //start retransmission timer
                        t_minRetrans.start;
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Pre-conditions: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Test Body
                tc_ac.start;
                alt {
                    [] t_minRetrans.timeout {
                        log("*** " & testcasename() & ": Ready for retransmission ***");
                        v_retransmitOk := true;
                        repeat;
                    }
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        if(v_retransmitOk == true) {
                            log("*** " & testcasename() & ": LS_REQUEST correctly retransmitted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": LS_REQUEST retransmitted too early ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": No LS_REQUEST retransmitted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_06
            
            /**
             * @desc    Test of LS Request retransmission if no answer is received
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send a GeoUnicast packet to ItsNodeA
             *          containing TrafficClass.SCF set to 1
             *          containing LT field
             *              indicating value LT1 higher than (itsGnLocationServiceTimer * itsGnLocationServiceMaxRetrans) and
             *      the IUT having sent a LS_REQUEST packet
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT does not receive LS_REPLY packet from ItsNodeA and
             *          before expiration of LT1
             *      }
             *      then {
             *          the IUT retransmits the LS_REQUEST packet itsGnLocationServiceMaxRetrans times
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/07
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.7.1.2, 9.3.7.1.3 and 9.3.8.2
             */
            testcase TC_GEONW_PON_LOS_BV_07() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var integer v_maxNbrRetrans := f_getLsMaxRetrans();
                var integer v_nbLsReceived := 0;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithLifetime(
                    v_longPosVectorNodeA.gnAddr,
			                    float2int(int2float(v_maxNbrRetrans + 2) * f_getLsRetransmitTimer() * 1000.0))) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Pre-conditions: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Test Body
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        v_nbLsReceived := v_nbLsReceived + 1;
                        if(v_nbLsReceived > v_maxNbrRetrans) {
                            //first LS request is not counted as a retransmission
                            log("*** " & testcasename() & ": LS_REQUEST retransmitted more than itsGnLocationServiceMaxRetrans times ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        else {
                            tc_ac.start;
                            repeat;
                        }
                    }
                    [] tc_ac.timeout {
                        if(v_nbLsReceived == (v_maxNbrRetrans)) {
                            //first LS request is not counted as a retransmission
                            log("*** " & testcasename() & ": LS_REQUEST retransmitted itsGnLocationServiceMaxRetrans times ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": LS_REQUEST retransmitted less than itsGnLocationServiceMaxRetrans times ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_07
            
            /**
             * @desc    Test of LS Reply generation by destination node
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a LS_REQUEST packet
             *          containing Request field
             *              indicating the IUT's GN_ADDR
             *      }
             *      then {
             *          the IUT replies with a LS_REPLY packet
             *              containing Common Header
             *                  containing NH field
             *                      set to '0' (UNSPECIFIED)
             *                  containing LS_REPLY Extended Header
             *                      containing DEPV field
             *                          indicating same position as the SOPV value of the received LS_REQUEST
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/08
             * @reference   EN 302 636-4-1 [1], clauses 9.3.7.3 and 9.3.5
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOS_BV_08() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var GN_Address v_iutGnAddress;
                var UInt16 v_seqNbr := vc_localSeqNumber;
                var FncRetCode v_ret := e_error;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                v_iutGnAddress := f_getPosition(c_compIut).gnAddr;
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_ret := f_processLocationService(v_longPosVectorNodeA, v_seqNbr, v_iutGnAddress, v_longPosVectorIut);
                if (v_ret == e_success) {
                    log("*** " & testcasename() & ": LS_REPLY packet received correctly ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": LS_REPLY packet not received correctly ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_08
            
            group GEONW_PON_LOS_BV_09 {
                
                /**
                 * @desc    Test of no LS Reply generation for already answered LS Request packets
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a LS_REQUEST packet generated by ItsNodeB from ItsNodeB
                 *      the IUT having sent a LS_REPLY packet to ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same LS_REQUEST packet from ItsNodeD
                 *      }
                 *      then {
                 *          the IUT does not reply with a LS_REPLY packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/09
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.7.3 and 9.3.5
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_LOS_BV_09() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_LOS_BV_09_nodeB());
                    v_nodeD.start(f_GEONW_PON_LOS_BV_09_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_LOS_BV_09
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_LOS_BV_09)
                 */
                function f_GEONW_PON_LOS_BV_09_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var FncRetCode v_ret := e_error;
                    
                    // Preamble
                    f_prNeighbour();
                    v_ret := f_processLocationService(
                        v_longPosVectorNodeB,
                        vc_localSeqNumber,
                        v_longPosVectorIut.gnAddr,
                        v_longPosVectorIut);
                    if (v_ret == e_error) {
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    }
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwLsReplyPacket(
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB))
                                        )
                                    )
                                )
                            ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: LS_REQUEST has not been discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: LS_REQUEST discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_LOS_BV_09_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_LOS_BV_09)
                 */
                function f_GEONW_PON_LOS_BV_09_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GN_Address v_iutGnAddress := f_getPosition(c_compIut).gnAddr;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwLsRequestPacket(
                                    v_longPosVectorNodeB,
                                    vc_localSeqNumber,
                                    v_iutGnAddress
                                )
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwLsReplyPacket(
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB))
                                        )
                                    )
                                )
                            ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: LS_REQUEST has not been discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: LS_REQUEST discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_LOS_BV_09_nodeD
                
            } // end GEONW_PON_LOS_BV_09
            
            group GEONW_PON_LOS_BV_10 {
                
                /**
                 * @desc    Test of LS Request forwarding
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a LS_REQUEST packet from ItsNodeC
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value greater than 1
                 *              containing LS_REQUEST Extended Header
                 *                  containing Request field
                 *                      containing GN_ADDR
                 *                          containing M_ID
                 *                              indicating value differing from the M_ID part of the GN_ADDR of the IUT
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the received LS_REQUEST packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value decreased by 1
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see     ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/10
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.7.2
                 */
                testcase TC_GEONW_PON_LOS_BV_10() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_LOS_BV_10_nodeB());
                    v_nodeC.start(f_GEONW_PON_LOS_BV_10_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_LOS_BV_10
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_LOS_BV_10)
                 */
                function f_GEONW_PON_LOS_BV_10_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                     alt {
                         [] geoNetworkingPort.receive(
                             mw_geoNwInd(
                                 mw_geoNwPdu(
                                     mw_geoNwLsRequestPacket(
                                         ?,
                                         v_longPosVectorNodeB.gnAddr.mid
                                     ),
                                     -,
                                     c_defaultHopLimit - 1
                                 )
                             )
                         ) {
                             tc_ac.stop;
                             log("*** " & testcasename() & ": PASS: Re-broadcasted LS Request received with HL field decreased by 1 ***");
                             f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                         }
                         [] tc_ac.timeout {
                             log("*** " & testcasename() & ": FAIL: LS Request was not re-broadcasted ***");
                             f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                         }
                     }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_LOS_BV_10_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_LOS_BV_10)
                 */
                function f_GEONW_PON_LOS_BV_10_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwLsRequestPacket(
                                    f_getPosition(c_compNodeA),
                                    vc_localSeqNumber,
                                    f_getPosition(c_compNodeB).gnAddr
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_LOS_BV_10_nodeC
                
            } // end GEONW_PON_LOS_BV_10
            
            group GEONW_PON_LOS_BV_11 {
                
                /**
                 * @desc    Test of LS Reply forwarding
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a LS_REPLY packet from ItsNodeC addressed to ItsNodeB
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value greater than 1
                 *      }
                 *      then {
                 *          the IUT forwards the received LS_REPLY packet to ItsNodeB
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value decreased by 1
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/11
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.7.2
                 */
                testcase TC_GEONW_PON_LOS_BV_11() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_LOS_BV_11_nodeB());
                    v_nodeC.start(f_GEONW_PON_LOS_BV_11_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_LOS_BV_11
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_LOS_BV_11)
                 */
                function f_GEONW_PON_LOS_BV_11_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwLsReplyPacket(
                                        mw_longPosVectorPosition(v_longPosVectorNodeA),
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB))
                                    ),
                                    -,
                                    c_defaultHopLimit - 1
                                )
                            )
                        ) {
                            log("*** " & testcasename() & ": PASS: Forwarded LS Reply received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: LS Reply was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_LOS_BV_11_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_LOS_BV_11)
                 */
                function f_GEONW_PON_LOS_BV_11_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwLsReplyPacket(
                                    f_getPosition(c_compNodeA),
                                    f_longPosVector2ShortPosVector(f_getPosition(c_compNodeB)),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_LOS_BV_11_nodeC
                
            } // end GEONW_PON_LOS_BV_11
            
            /**
             * @desc    Test flushing of the LS buffer, initiated by the processing of a common header from the target destination
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send a GeoUnicast packet ItsNodeA
             *          containing LT field
             *              indicating LT1 and
             *      the IUT having sent a LS_REQUEST packet
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a GeoUnicast packet addressed to it from ItsNodeA before expiry of LT1
filatov's avatar
filatov committed
             *      }
             *      then {
             *          the IUT sends the waiting GeoUnicast packet to ItsNodeA
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/12
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.7.1.2 and 7.4.2
             */
            testcase TC_GEONW_PON_LOS_BV_12() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var UInt16 v_seqNbr := vc_localSeqNumber;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Pre-conditions: LS Request not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Test Body
                f_sendGeoNetMessage(
                    m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(
                            m_geoNwUnicastPacket(
                                v_longPosVectorNodeA,
                                f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                vc_localSeqNumber
                            )
                        )
                    )
                );
                
                tc_ac.start;
                alt {
                    [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: GeoUnicast packet received correctly ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_12
            
            /**
             * @desc    Test of LS buffer characteristics: FIFO type and Lifetime
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send a GeoUnicast packet to ItsNodeA
             *          containing TrafficClass.SCF set to 1
             *          containing LT field
             *              indicating value LT1
             *          containing payload field
             *              indicating value PL1 and
             *      the IUT having sent a LS_REQUEST packet and
             *      the IUT having been requested to send a second GeoUnicast packet to ItsNodeA
             *          containing TrafficClass.SCF set to 1
             *          containing LT field
             *              indicating LT2 lower than LT1
             *          containing payload field
             *              indicating value PL2
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives the LS_REPLY packet from ItsNodeA
             *              after expiry of LT2
             *              before expiry of LT1
             *      }
             *      then {
             *          the IUT sends GeoUnicast packet addressed to ItsNodeA
             *              containing payload field
             *                  indicating value PL1
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/13
             * @reference   EN 302 636-4-1 [1], clauses 7.4.3, 9.3.7.1.2
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOS_BV_13() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var integer v_lt1 := f_getLsMaxRetrans()*float2int(f_getLsRetransmitTimer());
                var integer v_lt2 := float2int(int2float(v_lt1)/2.0);
                var octetstring v_payload1 := char2oct("PAYLOAD_1");
                var octetstring v_payload2 := char2oct("PAYLOAD_2");
                var boolean v_msg1Received := false;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithLifetimeWithPayload(v_longPosVectorNodeA.gnAddr, v_lt2*1000, v_payload2)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithLifetimeWithPayload(v_longPosVectorNodeA.gnAddr, v_lt1*1000, v_payload1)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    }
                        
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Pre-conditions: LS Request not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                //Send LS-REPLY after LT2 expiry
                f_sleepIgnoreDef(int2float(v_lt2));
                
                f_sendGeoNetMessage(
                    m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(
                            m_geoNwLsReplyPacket(
                                v_longPosVectorNodeA,
                                f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                vc_localSeqNumber
                            )
                        )
                    )
                );
                
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        log("*** " & testcasename() & ": INFO: LS Request retransmission ignored ***");
                        repeat;
                    }
                    [] geoNetworkingPort.receive(
                        f_receiveGeoNetMessageWithPayload(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            ),
                            f_adaptPayload_mw(v_payload1)
                        )
                    ) {
                        v_msg1Received := true;
                        repeat;
                    }
                    [] geoNetworkingPort.receive(
                        f_receiveGeoNetMessageWithPayload(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            ),
                            f_adaptPayload_mw(v_payload2)
                        )
                    ) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: message with elapsed lifetime received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        if(v_msg1Received == true) {
                            log("*** " & testcasename() & ": PASS: message with running lifetime received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": FAIL: message with running lifetime not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_13
            
            /**
             * @desc    Test that GeoNetworking packets in LS buffer are discarded when LS does not complete
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having been requested to send a GeoUnicast packet to ItsNodeA
             *          containing TrafficClass.SCF set to 1
             *          containing LT field
             *              indicating value LT1 higher than (itsGnLocationServiceTimer * itsGnLocationServiceMaxRetrans) and
             *      the IUT having sent a LS_REQUEST packet itsGnLocationServiceMaxRetrans times
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a GUC packet from ItsNodeA
             *              before expiration of LT1
             *      }
             *      then {
             *          the IUT does not send any packet to ItsNodeA (see note)
             *      }
             *  }
             *  NOTE: Stored GeoUnicast packets have been discarded upon LS failure
             *  
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/14
             * @reference   EN 302 636-4-1 [1], clauses 7.4.3
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_PON_LOS_BV_14() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorIut;
                var integer v_maxNbrRetrans := f_getLsMaxRetrans();
                var integer v_nbLsReceived := 0;
                var UInt16 v_LT1;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                v_LT1 := float2int(int2float(v_maxNbrRetrans + 2) * f_getLsRetransmitTimer() * 1000.0);
                 if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithLifetime(v_longPosVectorNodeA.gnAddr,v_LT1)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                
                tc_wait.start(int2float(v_LT1));
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Pre-conditions: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        v_nbLsReceived := v_nbLsReceived + 1;
                        if(v_nbLsReceived > v_maxNbrRetrans) {
                            //first LS request is not counted as a retransmission
                            log("*** " & testcasename() & ": Pre-conditions: LS_REQUEST retransmitted more than itsGnLocationServiceMaxRetrans times ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_error);
filatov's avatar
filatov committed
                        }
                        else {
                            tc_ac.start;
                            repeat;
                        }
                    }
                    [] tc_ac.timeout {
                        if(v_nbLsReceived == (v_maxNbrRetrans)) {
                            //first LS request is not counted as a retransmission
                            log("*** " & testcasename() & ": Pre-conditions: LS_REQUEST retransmitted itsGnLocationServiceMaxRetrans times ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": Pre-conditions: LS_REQUEST retransmitted less than itsGnLocationServiceMaxRetrans times ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                }
                
                // Test Body
                if (tc_wait.running) {
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    v_longPosVectorNodeA,
                                    f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                    vc_localSeqNumber
                                )
                            )
                        )
                    );
                    tc_wait.stop;
                    
                    tc_noac.start;
                    alt {
                        // no check for ItsNodeA address as no other trigger for messages exists
                        [] geoNetworkingPort.receive {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Unexpected message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message was sent ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    log("*** " & testcasename() & ": FAIL: LT1 expired ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_14

            /**
             * @desc    Test flushing of the LS buffer, initiated by the processing of a common header from the target destination
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *  	the IUT being in the "initial state" and
             *  	the IUT having no Location Table Entry for ItsNodeA and
             *  	the IUT having been requested to send a GeoUnicast packet ItsNodeA
             *  		containing LT field
             *  			indicating LT1 and
             *  	the IUT having sent a LS_REQUEST packet
             *  }
             * Expected behaviour:
             *  ensure that {
             *  	when {
             *  		the IUT receives a GeoUnicast packet addressed to ItsNodeB from ItsNodeA before expiry of LT1
             *  	}
             *  	then {
             *  		the IUT sends the waiting GeoUnicast packet to ItsNodeA
             *  	}
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/15
             * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, 9.3.7.1.2 and 7.4.2
             */
            testcase TC_GEONW_PON_LOS_BV_15() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                var UInt16 v_seqNbr := vc_localSeqNumber;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Pre-conditions: LS Request not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    }
                }
                
                // Test Body
                f_sendGeoNetMessage(
                    m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(
                            m_geoNwUnicastPacket(
                                v_longPosVectorNodeA,
                                f_longPosVector2ShortPosVector(v_longPosVectorNodeB),
                                vc_localSeqNumber
                            )
                        )
                    )
                );
                
                tc_ac.start;
                alt {
                    [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: GeoUnicast packet received correctly ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_15

            /**
             * @desc    Test of LS Request retransmission termination when indirect response is received
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *  	the IUT being in the "initial state" and
             *  	the IUT having no Location Table Entry for ItsNodeA and
             *  	the IUT having been requested to send a GeoUnicast packet to ItsNodeA
             *  		containing TrafficClass.SCF set to 1
             *  		containing LT field
             *  			indicating value LT1 higher than (itsGnLocationServiceTimer * itsGnLocationServiceMaxRetrans) and
             *  	the IUT having sent a LS_REQUEST packet
             *  	the IUT having retransmitted the LS_REQUEST packet less than itsGnLocationServiceMaxRetrans
             *  }
             * Expected behaviour:
             *  ensure that {
             *  	when {
             *  		the IUT receives a GeoUnicast packet addressed to it from ItsNodeA before expiry of LT1
             *  	}
             *  	then {
             *  		the IUT does not retransmits the LS_REQUEST packet
             *  	}
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/16
             * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4, 9.3.7.1.2, 9.3.7.1.3 and 9.3.8.2
             */
            testcase TC_GEONW_PON_LOS_BV_16() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                var UInt16 v_seqNbr := vc_localSeqNumber;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Pre-conditions: LS Request not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    }
                }
                
                // Test Body
                f_sendGeoNetMessage(
                    m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(
                            m_geoNwUnicastPacket(
                                v_longPosVectorNodeA,
                                f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                vc_localSeqNumber
                            )
                        )
                    )
                );
                
                tc_noac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_noac.stop;
                        log("*** " & testcasename() & ": FAIL: LS Request retransmitted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA))) {
                        log("*** " & testcasename() & ": INFO: GeoUnicast packet received ***");
                        repeat;
                    }
                    [] tc_noac.timeout {
                        log("*** " & testcasename() & ": PASS: LS Request not retransmitted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_16

            /**
             * @desc    Test of LS Request retransmission termination when indirect response is received
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *  	the IUT being in the "initial state" and
             *  	the IUT having no Location Table Entry for ItsNodeA and
             *  	the IUT having been requested to send a GeoUnicast packet to ItsNodeA
             *  		containing TrafficClass.SCF set to 1
             *  		containing LT field
             *  			indicating value LT1 higher than (itsGnLocationServiceTimer * itsGnLocationServiceMaxRetrans) and
             *  	the IUT having sent a LS_REQUEST packet
             *  	the IUT having retransmitted the LS_REQUEST packet less than itsGnLocationServiceMaxRetrans
             *  }
             * Expected behaviour:
             *  ensure that {
             *  	when {
             *  		the IUT receives a GeoUnicast packet addressed to ItsNodeB from ItsNodeA before expiry of LT1
             *  	}
             *  	then {
             *  		the IUT does not retransmits the LS_REQUEST packet
             *  	}
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/LOS/BV/17
             * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, 9.3.7.1.2, 9.3.7.1.3 and 9.3.8.2
             */
            testcase TC_GEONW_PON_LOS_BV_17() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                var UInt16 v_seqNbr := vc_localSeqNumber;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_ac.stop;
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Pre-conditions: LS Request not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    }
                }
                
                // Test Body
                f_sendGeoNetMessage(
                    m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(
                            m_geoNwUnicastPacket(
                                v_longPosVectorNodeA,
                                f_longPosVector2ShortPosVector(v_longPosVectorNodeB),
                                vc_localSeqNumber
                            )
                        )
                    )
                );
                
                tc_noac.start;
                alt {
                    [] a_receiveLsRequest(?, v_longPosVectorNodeA.gnAddr.mid, v_longPosVectorIut) {
                        tc_noac.stop;
                        log("*** " & testcasename() & ": FAIL: LS Request retransmitted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] a_receiveGeoUnicastWithDestination(mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA))) {
                        log("*** " & testcasename() & ": INFO: GeoUnicast packet received ***");
                        repeat;
                    }
                    [] tc_noac.timeout {
                        log("*** " & testcasename() & ": PASS: LS Request not retransmitted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_LOS_BV_17
filatov's avatar
filatov committed
            
        } // end geoLocationService
        
        // 6.2.2.5
        group geoForwardingPacketBuffer {
            
            group GEONW_PON_FPB_BV_01 {
                
                /**
                 * @desc    Test of Source packet buffering into UC forwarding buffer for unreachable Unicast destinations
                 *          (absence of a suitable next hop candidate)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having a Location Table Entry for ItsNodeA (see note) and
                 *      the IUT having been requested to send a GeoUnicast packet addressed to ItsNodeA
                 *          containing TrafficClass.SCF set to 1
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from ItsNodeB
                 *      }
                 *      then {
                 *          the IUT selects the ItsNodeB as the next hop and
                 *          the IUT sends the buffered GeoUnicast packet
                 *      }
                 *  }
                 *  NOTE: Location Table Entry is created by sending any GeoNetworking packet, originated by ItsNodeA, from ItsNodeC to IUT
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/01
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3, 9.3.6.3, 9.3.4.2 and 9.3.8.3
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_FPB_BV_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_01_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_01_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_01
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_01)
                 */
                function f_GEONW_PON_FPB_BV_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prDefault(); // NodeB is not yet a neighbour
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleepIgnoreDef(1.0);
                    f_startBeingNeighbour();
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveAnyLsRequest() {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": INCONC: Received Location Service Request ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                        }
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwUnicastPacket(
                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                            ?)))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: packet correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_01)
                 */
                function f_GEONW_PON_FPB_BV_01_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    
                    // Make sure IUT has LocE for NodeA by sending unsolicited LS_REPLY
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(
                        m_geoNwLsReplyPacket(
                            v_longPosVectorNodeA,
                            f_longPosVector2ShortPosVector(v_longPosVectorIut),
                            vc_localSeqNumber
                        )
                    )));
                    
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    // /!\ This pre-condition has impact on test body
	                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
	                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
	                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
	                }
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoUnicast packet received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_01_nodeC
                
            } // end GEONW_PON_FPB_BV_01
            
            group GEONW_PON_FPB_BV_02 {
                
                /**
                 * @desc    Test of Forwarder packet buffering into UC forwarding buffer for unreachable Unicast destinations
                 *          (absence of a suitable next hop candidate)
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having received GeoUnicast packets addressed to ItsNodeA from ItsNodeC
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing LT field
                 *                  indicating LT1
                 *              containing RHL field
                 *                  indicating value greater than 1
                 *          containing GUC Extended Header
                 *              containing SN field
                 *                  indicating value SN1
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from ItsNodeB
                 *      }
                 *      then {
                 *          the IUT selects the ItsNodeB as the next hop and
                 *          the IUT forwards the buffered GeoUnicast packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value decreased by 1
                 *              containing GUC Extended Header
                 *                  containing SN field
                 *                      indicating value SN1
                 *      }
                 *   }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/02
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, 7.5.3, 9.3.6.3
                 */
                testcase TC_GEONW_PON_FPB_BV_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    const UInt16 c_sequenceNumberC := f_getInitialSequenceNumber();
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_02_nodeB(c_sequenceNumberC));
                    v_nodeC.start(f_GEONW_PON_FPB_BV_02_nodeC(c_sequenceNumberC));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_02)
                 */
                function f_GEONW_PON_FPB_BV_02_nodeB(in UInt16 p_sequenceNumberC) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prDefault(); // NodeB is not yet a neighbour
                    vc_localSeqNumber := p_sequenceNumberC;
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleep(1.0);
                    f_startBeingNeighbour();
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        vc_localSeqNumber
                                    ),
                                    -,
                                    c_defaultHopLimit - 1
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Packet correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_02)
                 */
                function f_GEONW_PON_FPB_BV_02_nodeC(in UInt16 p_sequenceNumberC) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    vc_localSeqNumber := p_sequenceNumberC;
                    
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    v_longPosVectorNodeC,
                                    f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_02_nodeC
                
            } // end GEONW_PON_FPB_BV_02
            
            group GEONW_PON_FPB_BV_03 {
                
                /**
                 * @desc    Test of UC forwarding buffer characteristics: FIFO type
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having received a GeoUnicast (GEOUNI1) packet addressed to ItsNodeA from ItsNodeC
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing LT field
                 *                  indicating value LT1 and
                 *              containing RHL field
                 *                  indicating value greater than 1
                 *          containing GUC Extended Header
                 *              containing SN field
                 *                  indicating value SN1
                 *      the IUT having received a second GeoUnicast (GEOUNI2) packet addressed to ItsNodeA from ItsNodeC
                 *          containing TrafficClass.SCF set to 1 
                 *          containing Basic Header
                 *              containing LT field
                 *                  indicating LT2
                 *              containing RHL field
                 *                  indicating value greater than 1
                 *          containing GUC Extended Header
                 *              containing SN field
                 *                  indicating value SN2
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from ItsNodeB
                 *          before expiry of LT1 and LT2
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop and
                 *          the IUT forwards the GEOUNI1 buffered packet
                 *              containing GUC Extended Header
                 *                  containing SN field
                 *                      indicating value SN1
                 *          the IUT forwards the GEOUNI2 buffered packet
                 *              containing GUC Extended Header
                 *                  containing SN field
                 *                      indicating value SN2
                 *      }
                 *   }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/03
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3, 9.3.6.3 and 9.3.8.3
                 */
                testcase TC_GEONW_PON_FPB_BV_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    const UInt16 c_sequenceNumberC := f_getInitialSequenceNumber();
                    const integer c_messageCount := 2;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_03_nodeB(c_sequenceNumberC, c_messageCount));
                    v_nodeC.start(f_GEONW_PON_FPB_BV_03_nodeC(c_sequenceNumberC, c_messageCount));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_03)
                 */
                function f_GEONW_PON_FPB_BV_03_nodeB(in UInt16 p_sequenceNumberC, in integer p_messageCount) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    var UInt16 v_expectedSequenceNumber := p_sequenceNumberC;
                    var integer v_nbReceivedPackets := 0;
                    
                    // Preamble
                    f_prDefault(); // NodeB is not yet a neighbour
                    vc_multipleMessagesCount := p_messageCount;
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleep(1.0);
                    f_startBeingNeighbour();
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoUnicast(
                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                            v_expectedSequenceNumber) {
                            tc_ac.stop;
                            v_nbReceivedPackets := v_nbReceivedPackets + 1;
                            if(v_nbReceivedPackets >= vc_multipleMessagesCount) {
                                log("*** " & testcasename() & ": PASS: GeoUnicast packets received in correct order ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                            else {
                                v_expectedSequenceNumber := v_expectedSequenceNumber + 1;
                                tc_ac.start;
                                repeat;
                            }
                        }
                        [] a_receiveGeoUnicast(
                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                            ?) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoUnicast packet received in incorrect order ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_03)
                 */
                function f_GEONW_PON_FPB_BV_03_nodeC(in UInt16 p_sequenceNumberC, in integer p_messageCount) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var integer i := 0;
                    
                    // Preamble
                    f_prNeighbour();
                    vc_localSeqNumber := p_sequenceNumberC;
                    vc_multipleMessagesCount := p_messageCount;
                    
                    for(i:=0; i < vc_multipleMessagesCount; i:=i+1) {
                        f_sendGeoNetMessage(
                            m_geoNwReq_linkLayerBroadcast(
                                m_geoNwPdu(
                                    m_geoNwUnicastPacket(
                                        v_longPosVectorNodeC,
                                        f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                        vc_localSeqNumber
                                    )
                                )
                            )
                        );
                    }
                    
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_03_nodeC
                
            } // end GEONW_PON_FPB_BV_03
            
            group GEONW_PON_FPB_BV_04 {
                
                /**
                 * @desc    Test of UC forwarding buffer characteristics: discarding upon LT expiration
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having received a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing LT field
                 *                  indicating LT1
                 *              containing RHL field
                 *                  indicating value greater than 1
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from ItsNodeB
                 *          after expiry of LT1
                 *      }
                 *      then {
                 *          the IUT does not forward the buffered GeoUnicast packet addressed to ItsNodeA
                 *      }
                 *   }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/03
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3, 9.3.6.3 and 9.3.8.3
                 */
                testcase TC_GEONW_PON_FPB_BV_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    const UInt6 c_packetLifetime := 10; // 10s
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_04_nodeB(c_packetLifetime));
                    v_nodeC.start(f_GEONW_PON_FPB_BV_04_nodeC(c_packetLifetime));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_04)
                 */
                function f_GEONW_PON_FPB_BV_04_nodeB(in UInt6 p_packetLifetime) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    var integer v_nbReceivedPackets := 0;
                    
                    // Preamble
                    f_prDefault(); // NodeB is not yet a neighbour
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleep(int2float(p_packetLifetime + 1));
                    f_startBeingNeighbour();
                    
                    tc_noac.start;
                    alt {                        
                        [] a_receiveGeoUnicast(
                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                            ?) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoUnicast packet received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_04)
                 */
                function f_GEONW_PON_FPB_BV_04_nodeC(in UInt6 p_packetLifetime) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    v_longPosVectorNodeC,
                                    f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                m_lifetimeBase1s(p_packetLifetime),
                                c_defaultHopLimit
                            )
                        )
                    );
                    
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_04_nodeC
                
            } // end GEONW_PON_FPB_BV_04
           
            group GEONW_PON_FPB_BV_06 {
                
                /**
                 * @desc    Test of Source packet buffering into BC forwarding buffer for no recipients
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received Beacon information from ItsNodeD and
                 *      the IUT not having received Beacon information from ItsNodeB and
                 *      the IUT having been requested to send a TSB packet
filatov's avatar
filatov committed
                 *          containing TrafficClass.SCF set to 1
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from either ItsNodeB or ItsNodeD
                 *      }
                 *      then {
                 *          the IUT broadcasts the buffered TSB packet
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/06
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.5, 7.5.3, 9.3.6.3 and 9.3.11.2
                 */
                 testcase TC_GEONW_PON_FPB_BV_06() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_06_nodeB());
                    v_nodeD.start(f_GEONW_PON_FPB_BV_06_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_FPB_BV_06
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_06)
                 */
                function f_GEONW_PON_FPB_BV_06_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    
                    // Preamble
                    f_prDefault();
                    if (not f_utTriggerEvent(m_generateTsbMessage)) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleep(1.0);
                    f_startBeingNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?, 
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) -> value v_geoNetInd {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast packet received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_06_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_FPB_BV_06)
                 */
                function f_GEONW_PON_FPB_BV_06_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    
                    // Preamble
                    f_prDefault();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) -> value v_geoNetInd {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast packet received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_06_nodeD
                
            } // end GEONW_PON_FPB_BV_06
            
            group GEONW_PON_FPB_BV_07 {
                
                /**
                 * @desc    Test of BC forwarding buffer characteristics: FIFO type
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received Beacon information from ItsNodeD and
                 *      the IUT not having received Beacon information from ItsNodeB and
                 *      the IUT having been requested to send a TSB (TSB1) packet
filatov's avatar
filatov committed
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing LT field
                 *                  indicating LT1
                 *          containing TSB Extended Header
filatov's avatar
filatov committed
                 *              containing SN field
                 *                  indicating value SN1
                 *      the IUT having been requested to send a TSB (TSB2) packet
filatov's avatar
filatov committed
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing LT field
                 *                  indicating LT2
                 *          containing TSB Extended Header
filatov's avatar
filatov committed
                 *              containing SN field
                 *                  indicating value SN2
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from either ItsNodeD or ItsNodeB
                 *          before expiry of LT1 and LT2
                 *      }
                 *      then {
                 *          the IUT broadcasts TSB1 packet
                 *              containing TSB Extended Header
filatov's avatar
filatov committed
                 *                  containing SN field
                 *                      indicating value SN1
                 *          the IUT broadcasts TSB2 packet
                 *              containing TSB Extended Header
filatov's avatar
filatov committed
                 *                  containing SN field
                 *                      indicating value SN2
                 *      }
                 *   }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/07
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3, 9.3.6.3 and 9.3.11.2
                 */
                testcase TC_GEONW_PON_FPB_BV_07() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    const integer v_messageCount := 2;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_07_nodeB(v_messageCount));
                    v_nodeD.start(f_GEONW_PON_FPB_BV_07_nodeD(v_messageCount));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_FPB_BV_07
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_07)
                 */
                function f_GEONW_PON_FPB_BV_07_nodeB(in integer p_messageCount) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    var template (present) UInt16 v_expectedSequenceNumber := ?;
                    var integer v_nbReceivedPackets := 0;
                    var integer i := 0;
                    
                    // Preamble
                    f_prDefault();
                    vc_multipleMessagesCount := p_messageCount;
                    for(i:=0; i < vc_multipleMessagesCount; i:=i+1) {
	                    if(not f_utTriggerEvent(m_generateTsbMessage)) {
filatov's avatar
filatov committed
	                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
	                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
	                    }
                    }

                    tc_ac.start(1.0);
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": INCONC: GeoBroadcast packet not buffered ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast packet buffered ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                    }                    
                    
                    // Test Body
                    f_startBeingNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(
                        	v_expectedSequenceNumber,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) -> value v_geoNetInd {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            v_nbReceivedPackets := v_nbReceivedPackets + 1;
                            if(v_nbReceivedPackets >= vc_multipleMessagesCount) {
                                log("*** " & testcasename() & ": PASS: TSB packets received in correct order ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                                v_expectedSequenceNumber := v_geoNetInd.msgIn.gnPacket.packet.extendedHeader.tsbHeader.seqNumber + 1;
filatov's avatar
filatov committed
                                tc_ac.start;
                                repeat;
                            }
                        }
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: TSB packet received in incorrect order ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_07_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_FPB_BV_07)
                 */
                function f_GEONW_PON_FPB_BV_07_nodeD(in integer p_messageCount) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    var template (present) UInt16 v_expectedSequenceNumber := ?;
                    var integer v_nbReceivedPackets := 0;
                    var integer i := 0;
                    
                    // Preamble
                    f_prDefault();
                    vc_multipleMessagesCount := p_messageCount;
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(v_expectedSequenceNumber,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) -> value v_geoNetInd  {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            v_nbReceivedPackets := v_nbReceivedPackets + 1;
                            if(v_nbReceivedPackets >= vc_multipleMessagesCount) {
                                log("*** " & testcasename() & ": PASS: TSB packets received in correct order ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                                v_expectedSequenceNumber := v_geoNetInd.msgIn.gnPacket.packet.extendedHeader.tsbHeader.seqNumber + 1;
filatov's avatar
filatov committed
                                tc_ac.start;
                                repeat;
                            }
                        }
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: TSB packet received in incorrect order ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_07_nodeD
                
            } // end GEONW_PON_FPB_BV_07
            
            group GEONW_PON_FPB_BV_08 {
                
                /**
                 * @desc    Test of BC forwarding buffer characteristics: discarding upon LT expiration
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received Beacon information from ItsNodeD and
                 *      the IUT not having received Beacon information from ItsNodeB and
                 *      the IUT having been requested to send a TSB (TSB1) packet
filatov's avatar
filatov committed
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing LT field
                 *                  indicating LT1
                 *      the IUT having been requested to send a TSB (TSB2) packet
filatov's avatar
filatov committed
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing LT field
                 *                  indicating LT2
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from either ItsNodeB or ItsNodeD
                 *          after expiry of LT1 and LT2
                 *      }
                 *      then {
                 *          the IUT does not broadcast any of the buffered TSB1 and TSB2
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/08
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3, 9.3.6.3 and 9.3.11.2
                 */
                 testcase TC_GEONW_PON_FPB_BV_08() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_08_nodeB());
                    v_nodeD.start(f_GEONW_PON_FPB_BV_08_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_FPB_BV_08
                 
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_08)
                 */
                function f_GEONW_PON_FPB_BV_08_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    
                    // Preamble
                    f_prDefault();
                    if(not f_utTriggerEvent(m_generateTsbMessageWithLifetime(c_lifetime))) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    if(not f_utTriggerEvent(m_generateTsbMessageWithLifetime(c_lifetime))) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleep(int2float(c_defaultLifetime + 1));
                    f_startBeingNeighbour();
                    
                    tc_noac.start;
                    alt {
                        
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) {
filatov's avatar
filatov committed
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast packet received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_08_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_FPB_BV_08)
                 */
                function f_GEONW_PON_FPB_BV_08_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    
                    // Preamble
                    f_prDefault();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleep(int2float(c_defaultLifetime + 1));
                    f_startBeingNeighbour();
                    
                    tc_noac.start;
                    alt {
                        
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?, 
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) {
filatov's avatar
filatov committed
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast packet received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_08_nodeD
                
            } // end GEONW_PON_FPB_BV_08
            
            group GEONW_PON_FPB_BV_09 {
                 
                 /**
                 * @desc    Test of Source packet buffering into UC forwarding buffer for handling of LT fields in absence of
                 *          a suitable next hop candidate
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having a Location Table Entry for ItsNodeA and
                 *      the IUT having been requested to send a GeoUnicast packet addressed to ItsNodeA
                 *          containing TrafficClass.SCF set to 1
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from ItsNodeB
                 *      }
                 *      then {
                 *          the IUT selects the ItsNodeB as the next hop and
                 *          the IUT sends the buffered GeoUnicast packet
                 *              containing GUC Extended Header
                 *                  containing LT field
                 *                      indicating (default LT value – WaitingTime(see note))
                 *      }
                 *  }
                 *  NOTE: WaitingTime == time difference between Upper layer packet generation and the neighbour Beacon reception
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/09
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3, 9.3.6.3 and 9.3.8.2
                 */
                 testcase TC_GEONW_PON_FPB_BV_09() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_09_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_09_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_09
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_09)
                 */
                function f_GEONW_PON_FPB_BV_09_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var GeoNetworkingInd v_geoNetInd;
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleep(1.0);
                    f_startBeingNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwUnicastPacket(
                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                            ?)))) -> value v_geoNetInd {
                            tc_ac.stop;
                            
                            //we only check that the lifetime is less than the default lifetime due to
                            //we do not know exactly the time passed at IUT
                            if (f_getLifetimeValue(v_geoNetInd.msgIn.basicHeader.lifeTime) < f_getMaxPacketLifeTime()) {
                                log("*** " & testcasename() & ": PASS: Lifetime was handled properly ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": FAIL: Lifetime was not handled properly ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_09_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_09)
                 */
                function f_GEONW_PON_FPB_BV_09_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    
                    // Preamble
                    f_prNeighbour();
                    
                    // Make sure IUT has LocE for NodeA by sending unsolicited LS_REPLY
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(
                        m_geoNwLsReplyPacket(
                            v_longPosVectorNodeA,
                            f_longPosVector2ShortPosVector(v_longPosVectorIut),
                            vc_localSeqNumber
                        )
                    )));
                    
                    if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_09_nodeC
                 
            } // end GEONW_PON_FPB_BV_09
            
            group GEONW_PON_FPB_BV_10 {
                
                /**
                 * @desc    Test of Source packet buffering into BC forwarding buffer for handling of LT fields for no
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received Beacon information from ItsNodeD and
                 *      the IUT not having received Beacon information from ItsNodeB and
                 *      the IUT having been requested to send a TSB packet
filatov's avatar
filatov committed
                 *          containing TrafficClass.SCF set to 1
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a Beacon packet from either ItsNodeB or ItsNodeD
                 *      }
                 *      then {
                 *          the IUT broadcasts the buffered TSB packet
                 *              containing TSB Extended Header
filatov's avatar
filatov committed
                 *                  containing LT field
                 *                      indicating (default LT value - WaitingTime (see note))
                 *      }
                 *  }
                 *  NOTE: WaitingTime == time difference between Upper layer packet generation and the neighbour Beacon reception
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/10
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3, 9.3.6.3 and 9.3.11.2
                 */
                 testcase TC_GEONW_PON_FPB_BV_10() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_10_nodeB());
                    v_nodeD.start(f_GEONW_PON_FPB_BV_10_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_FPB_BV_10
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_10)
                 */
                function f_GEONW_PON_FPB_BV_10_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var GeoNetworkingInd v_geoNetInd;
                    
                    // Preamble
                    f_prDefault();
                    if(not f_utTriggerEvent(m_generateTsbMessage)) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleep(1.0);
                    f_startBeingNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) -> value v_geoNetInd {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            
                            //we only check that the lifetime is less than the default lifetime due to
                            //we do not know exactly the time passed at IUT
                            if (f_getLifetimeValue(v_geoNetInd.msgIn.basicHeader.lifeTime) < f_getMaxPacketLifeTime()) {
                                log("*** " & testcasename() & ": PASS: Lifetime was handled properly ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": FAIL: Lifetime was not handled properly ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_FPB_BV_10_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_FPB_BV_10)
                 */
                function f_GEONW_PON_FPB_BV_10_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prDefault();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwTsbPacket(?,
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut))))) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast packet received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_10_nodeD
                
            } // end GEONW_PON_FPB_BV_10
            
            group GEONW_PON_FPB_BV_11 {
                
                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having a Location Table Entry for ItsNodeA (see note)
                 *  }
                 *  
                 *  MESSAGE : GUC packet addressed to ItsNodeA
                 *  
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/11-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_11_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_11_01_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_11_01_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_11_01

                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_11_01)
                 */
                function f_GEONW_PON_FPB_BV_11_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variablesa
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwUnicastPacket(
                                            f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_11_01)
                 */
                function f_GEONW_PON_FPB_BV_11_01_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    // Make sure IUT has LocE for NodeA by sending unsolicited LS_REPLY
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(
                        m_geoNwLsReplyPacket(
                            v_longPosVectorNodeA,
                            f_longPosVector2ShortPosVector(v_longPosVectorIut),
                            vc_localSeqNumber
                        )
                    )));
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if(not f_utTriggerEvent(m_generateGeoUnicastMessageWithTrafficClass(
                            v_longPosVectorNodeA.gnAddr,
                            valueof(m_trafficClass(e_scfDisabled))))) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwUnicastPacket(
                                            f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_01_nodeC

                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having a Location Table Entry for ItsNodeA (see note)
                 *  }
                 *  
                 *  MESSAGE : GAC packet
                 *                containing GeoBroadcast DestinationArea
                 *                    indicating AREA2
                 *                    
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/11-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_11_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_11_02_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_11_02_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_11_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_11_02)
                 */
                function f_GEONW_PON_FPB_BV_11_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwAnycastPacket(
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_11_02)
                 */
                function f_GEONW_PON_FPB_BV_11_02_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if(not f_utTriggerEvent(m_generateGeoAnycastMessageWithTrafficClass(
                            f_getArea(c_area2),
                            valueof(m_trafficClass(e_scfDisabled))))) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwAnycastPacket(
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_02_nodeC
                
                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having a Location Table Entry for ItsNodeA (see note)
                 *  }
                 *  
                 *  MESSAGE : GBC packet
                 *                containing GeoBroadcast DestinationArea
                 *                    indicating AREA2
                 *                    
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/11-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_11_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_11_03_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_11_03_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_11_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_11_03)
                 */
                function f_GEONW_PON_FPB_BV_11_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwBroadcastPacket(
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_11_03)
                 */
                function f_GEONW_PON_FPB_BV_11_03_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if(not f_utTriggerEvent(m_generateGeoBroadcastMessageWithTrafficClass(
                            f_getArea(c_area2),
                            valueof(m_trafficClass(e_scfDisabled))))) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwBroadcastPacket(
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_03_nodeC
                
                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having a Location Table Entry for ItsNodeA (see note)
                 *  }
                 *  
                 *  MESSAGE : TSB packet
                 *  
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/11-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_11_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_11_04_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_11_04_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_11_04                                                

                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_11_04)
                 */
                function f_GEONW_PON_FPB_BV_11_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_11_04)
                 */
                function f_GEONW_PON_FPB_BV_11_04_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if(not f_utTriggerEvent(valueof(m_generateTsbMessageWithTrafficClass(valueof(m_trafficClass(e_scfDisabled)))))) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_04_nodeC
                
                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB and
                 *      the IUT having a Location Table Entry for ItsNodeA (see note)
                 *  }
                 *  
                 *  MESSAGE : SHB packet
                 *  
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/11-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_11_05() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_11_05_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_11_05_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_11_05
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_11_05)
                 */
                function f_GEONW_PON_FPB_BV_11_05_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwShbPacket(
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_05_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_11_05)
                 */
                function f_GEONW_PON_FPB_BV_11_05_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if(not f_utTriggerEvent(valueof(m_generateShbMessageWithTrafficClass(valueof(m_trafficClass(e_scfDisabled)))))) {
filatov's avatar
filatov committed
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwShbPacket(
                                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_05_nodeC
                
            } // end GEONW_PON_FPB_BV_11
            
            group GEONW_PON_FPB_BV_12 {
                
                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB
                 *  }
                 *    
                 *  MESSAGE : GUC packet addressed to ItsNodeA
                 *  
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *    
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/12-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_12_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_12_01_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_12_01_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_12_01

                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_12_01)
                 */
                function f_GEONW_PON_FPB_BV_12_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variablesa
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwUnicastPacket(
                                            f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_12_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_12_01)
                 */
                function f_GEONW_PON_FPB_BV_12_01_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(f_getPosition(c_compNodeA)),
                                    vc_localSeqNumber,
                                    -,
                                    m_trafficClass(e_scfDisabled)
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );

                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwUnicastPacket(
                                            f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_12_01_nodeC

                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB
                 *  }
                 *    
                 *  MESSAGE : GAC packet
                 *                containing GeoBroadcast DestinationArea
                 *                    indicating AREA2
                 *  
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/12-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_12_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_12_02_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_12_02_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_12_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_12_02)
                 */
                function f_GEONW_PON_FPB_BV_12_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwAnycastPacket(
                                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_12_02)
                 */
                function f_GEONW_PON_FPB_BV_12_02_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoAnycastArea(c_area2),
                                    -,
                                    m_trafficClass(e_scfDisabled)
                                )
                            )
                        )
                    );
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwAnycastPacket(
                                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_12_02_nodeC
                
                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB
                 *  }
                 *    
                 *  MESSAGE : GBC packet
                 *                containing GeoBroadcast DestinationArea
                 *                    indicating AREA2
                 * 
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *   
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/12-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_12_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_12_03_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_12_03_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_12_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_12_03)
                 */
                function f_GEONW_PON_FPB_BV_12_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwBroadcastPacket(
                                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_12_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_12_03)
                 */
                function f_GEONW_PON_FPB_BV_12_03_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2),
                                    -,
                                    m_trafficClass(e_scfDisabled)
                                )
                            )
                        )
                    );
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwBroadcastPacket(
                                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_11_03_nodeC
                
                /**
                 * @desc    Test of immediate broadcasting in absence of a suitable next hop candidate when SCF is disabled
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT not having received any Beacon information from ItsNodeB
                 *  }
                 *    
                 *  MESSAGE : TSB packet
                 *    
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a MESSAGE
                 *          containing TrafficClass.SCF set to 0
                 *      }
                 *      then {
                 *          the IUT broadcast the MESSAGE immediately
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/FPB/BV/12-X
                 * @reference   EN 302 636-4-1 [1], Annex D2
filatov's avatar
filatov committed
                 */
                 testcase TC_GEONW_PON_FPB_BV_12_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeC);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_FPB_BV_12_04_nodeB());
                    v_nodeC.start(f_GEONW_PON_FPB_BV_12_04_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_FPB_BV_11_04                                                

                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_FPB_BV_12_04)
                 */
                function f_GEONW_PON_FPB_BV_12_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeC)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_12_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_FPB_BV_12_04)
                 */
                function f_GEONW_PON_FPB_BV_12_04_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwTsbPacket(
                                    vc_localSeqNumber,
                                    v_longPosVectorNodeC,
                                    c_defaultHopLimit,
                                    m_trafficClass(e_scfDisabled)
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeC)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: TSB not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_FPB_BV_12_04_nodeC
                                 
            } // end GEONW_PON_FPB_BV_12
            
        } // end geoForwardingPacketBuffer
        
        // 6.2.2.6
        group geoGeoNetworkingAddress {
            
            /**
             * @desc    Test the initial GeoNetworking address assignment by IUT with auto-address configuration
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT's itsGnLocalAddrConfMethod MIB parameter is set to AUTO (0)
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT generates a Beacon packet
             *      }
             *      then {
             *          the IUT sends a GeoNetworking message
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '1' (BEACON)
             *                  containing HST field
             *                      set to '0' (UNSPECIFIED)
             *              containing a Beacon Extender Header
             *                  containing SOPV field
             *                      containing GN_ADDR field
             *                          indicating itsGnLocalGnAddr MIB parameter
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GNA/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.2.1.2 and 9.3.6.2
             */
            testcase TC_GEONW_PON_GNA_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                if(f_getIutGnLocalAddressConfigurationMethod() != e_initial) {
                    log("*** " & testcasename() & ": PICS_GN_LOCAL_ADDR_CONF_METHOD == e_initial required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                
                // Preamble
                f_prDefault();
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(
                            mw_geoNwBeaconPacket(
                                mw_longPosVectorAny(f_getIutGnLocalAddress())  // IUT's SOPV
                            )))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": GN address is correct ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(
                            mw_geoNwBeaconPacket(
                                ?  // any SOPV
                            )))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": GN address is not correct ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poDefault();
                f_cf01Down();
                
            } // end TC_GEONW_PON_GNA_BV_01
            
            /**
             * @desc    Test the proper functioning of duplicate address detection mechanism
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having sent some Beacon messages
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a Beacon message
             *              containing Beacon Extended Header
             *                  containing SOPV field
             *                      containing GN_ADDR field
             *                          indicating same GN_ADDR as the GN_ADDR field in the last Beacon originated by the IUT
             *      }
             *      then {
             *          the IUT sends subsequent Beacon messages
             *              containing Beacon Extended Header
             *                  containing SOPV field
             *                      containing GN_ADDR field
             *                          indicating different GN_ADDR as the previous used GN_ADDR
             *      }
             *   }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GNA/BV/02
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.2.1.4
             */
            testcase TC_GEONW_PON_GNA_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                var LongPosVector v_longPosVectorNodeB;
                var GeoNetworkingInd v_geoNetInd;
                var GN_Address v_iutGnAddress := valueof(m_dummyGnAddr);
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prDefault();
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(
                            mw_geoNwBeaconPacket(
                                ? // SO PV
                            )))) -> value v_geoNetInd {
                        v_iutGnAddress := valueof(v_geoNetInd.msgIn.gnPacket.packet.extendedHeader.beaconHeader.srcPosVector.gnAddr);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_longPosVectorNodeB.gnAddr := v_iutGnAddress;
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(m_geoNwBeaconPacket(v_longPosVectorNodeB), -, c_hopLimit1)));
                
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(
                            mw_geoNwBeaconPacket(
                                mw_longPosVectorAny(v_iutGnAddress) // SO PV
                            )))) {
                        log("*** " & testcasename() & ": IUT is still using old GN address. Waiting... ***");
                        repeat;
                    }
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(
                            mw_geoNwBeaconPacket(
                                ?  // SO PV
                            )))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": IUT used new GN address ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poDefault();
                f_cf01Down();
                
            } // end TC_GEONW_PON_GNA_BV_02
            
        } // end geoGeoNetworkingAddress
        
        // 6.2.2.7
        group geoBeaconing {
            
            /**
             * @desc    Test that the IUT transmits Beacons at prescribed periodicity in the absence of other originated
             *          packets
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT generates Beacon packets
             *      }
             *      then {
             *          the IUT sends each Beacon packet
             *              after expiry of itsGnBeaconServiceRetransmitTimer
             *              and before expiry of itsGnBeaconServiceRetransmitTimer + itsGnBeaconServiceMaxJitter
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BEA/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.6.2
             */
            testcase TC_GEONW_PON_BEA_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                var boolean v_beaconReceived := false;
                timer t_minRetransTimer := f_getBsRetransmitTimer();
                timer t_maxRetransTimer := f_getBsRetransmitTimer() + f_getBsMaxJitter();
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                
                // Preamble
                f_prDefault();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                
                t_maxRetransTimer.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBeaconPacket(?)))) {
                        if (v_beaconReceived == false) {
                            v_beaconReceived := true;
                            t_minRetransTimer.start;
                            t_maxRetransTimer.start;
                            //after the first beacon received, check the retransmission
                            repeat;
                        }
                        if(t_minRetransTimer.running) {
                            log("*** " & testcasename() & ": Beacon not transmitted at prescribed periodicity (too early) ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": Beacon transmitted at prescribed periodicity ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    [] t_minRetransTimer.timeout {
                        log("*** " & testcasename() & ": Ready for retransmission ***");
                        repeat;
                    }
                    [] t_maxRetransTimer.timeout {
                        log("*** " & testcasename() & ": Beacon not transmitted at prescribed periodicity (too late) ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                }
                f_acTriggerEvent(m_stopPassBeaconing);
                
                // Postamble
                f_poDefault();
                f_cf01Down();
                
            } // end TC_GEONW_PON_BEA_BV_01
            
            /**
             * @desc    Test that the IUT resets its timer for next Beacon transmission when originating other packets
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a SHB packet
             *      }
             *      then {
             *          the IUT broadcasts a SHB packet and
             *          the IUT sends the next Beacon packet
             *              after expiry of itsGnBeaconServiceRetransmitTimer
             *              and before expiry of itsGnBeaconServiceRetransmitTimer + itsGnBeaconServiceMaxJitter
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BEA/BV/02
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.2.3 and 9.3.10.2
             */
            testcase TC_GEONW_PON_BEA_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                var boolean v_geoUnicastReceived := false;
                var boolean v_readyForRetransmission := false;
                timer t_minRetransTimer := f_getBsRetransmitTimer() - f_getDeltaTimer();
                timer t_maxRetransTimer := f_getBsRetransmitTimer() + f_getBsMaxJitter() + f_getDeltaTimer();
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateShbMessage) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwShbPacket))) {
                        tc_ac.stop;
                        t_minRetransTimer.start;
                        t_maxRetransTimer.start;
                        v_geoUnicastReceived := true;
                        repeat;
                    }
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBeaconPacket))) {
                        if(not(v_geoUnicastReceived)) {
                            repeat;
                        }
                        if(not(v_readyForRetransmission)) {
                            log("*** " & testcasename() & ": Beacon not transmitted at prescribed periodicity (too early) ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        else {
                            log("*** " & testcasename() & ": Beacon transmitted at prescribed periodicity ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    [] t_minRetransTimer.timeout {
                        log("*** " & testcasename() & ": Ready for retransmission ***");
                        v_readyForRetransmission := true;
                        repeat;
                    }
                    [] t_maxRetransTimer.timeout {
                        log("*** " & testcasename() & ": Beacon not transmitted at prescribed periodicity (too late) ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": GeoUnicast not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                f_acTriggerEvent(m_stopPassBeaconing);
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_BEA_BV_02

            /**
             * @desc    Check that IUT sends a Beacon at startup
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *  	the IUT being switched off
             *  }
             * Expected behaviour:
             *  ensure that {
             *  	when {
             *  		the IUT is switched on
             *  	}
             *  	then {
             *  		the IUT sends a Beacon packet immediately
             *  	}
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BEA/BV/03
             * @reference   EN 302 636-4-1 [1], clauses 9.2.3 and 9.3.10.2
             */
            testcase TC_GEONW_PON_BEA_BV_03() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorIut;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorIut := f_getPosition(c_compIut);
                
                // Test adapter configuration
                
                // Preamble
                f_prDefault();
                action("Please turn IUT OFF");
                f_sleep(PX_TWAIT);
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                
                // Test Body
                f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
                geoNetworkingPort.clear;
                
                action("Please turn IUT ON");
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBeaconPacket(?)))) {
						log("*** " & testcasename() & ": PASS: Initial Beacon received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": FAIL: Initial Beacon not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                }
                f_acTriggerEvent(m_stopPassBeaconing);
                
                // Postamble
                f_poDefault();
                f_cf01Down();
                
            } // end TC_GEONW_PON_BEA_BV_03
filatov's avatar
filatov committed
            
        } // end geoBeaconing
        
        // 6.2.2.8
        group geoGeoUnicast {
            
            /**
             * @desc    Test that the reception of a unicast packet over upper Gn SAP triggers the origination of a
             *          GeoUnicast packet
             * <pre>
             * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'GREEDY' 
             * 				   OR PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'UNSPECIFIED'
filatov's avatar
filatov committed
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet to ItsNodeB
             *      }
             *      then {
             *          the IUT sends a GeoNetworking packet
             *              containing a correctly formatted Common Header
             *                  containing HT field
             *                      set to '2' (GEOUNICAST)
             *              containing GeoUnicast Extended Header
             *                  containing DEPV field
             *                      indicating same position as the SOPV value of the Beacon information received
             *      }
             *  }
             * </pre>
             *
             * @see     ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/01
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.8.2, 9.3.6.3
             */
            testcase TC_GEONW_PON_GUC_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                
                // Test control
                if ((f_getGeoUnicastForwardingAlgorithm() != e_greedy) and (f_getGeoUnicastForwardingAlgorithm() != e_unspecified)) {
                    log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == (e_greedy  or e_unspecified) required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                                
filatov's avatar
filatov committed
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)),
                                        ?
                                    )
                                )
                            )
                        ) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": DEPV of the received GeoUnicast message correctly set ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        ?,
                                        ?
                                    )
                                )
                            )
                        ) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": DEPV of the received GeoUnicast message incorrectly set ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Expected message not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_GUC_BV_01
            
            group GEONW_PON_GUC_BV_02 {
                
                /**
                 * @desc    Test that a received GeoUnicast packet is routed to the correct next hop neighbour according
                 *          to the greedy forwarding rules
                 * <pre>
                 * Pics Selection:  PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'GREEDY' 
                 *                  OR PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'UNSPECIFIED'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeC
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value greater than 1
                 *       }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop ITS station and
                 *          the IUT forwards the GeoUnicast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/02
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, Annex D.2
                 */
                testcase TC_GEONW_PON_GUC_BV_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if ((f_getGeoUnicastForwardingAlgorithm() != e_greedy) and (f_getGeoUnicastForwardingAlgorithm() != e_unspecified)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == (e_greedy  or e_unspecified) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_02_nodeB());
                    v_nodeC.start(f_GEONW_PON_GUC_BV_02_nodeC());
                    v_nodeD.start(f_GEONW_PON_GUC_BV_02_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GUC_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_02)
                 */
                function f_GEONW_PON_GUC_BV_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Forwarded GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_02)
                 */
                function f_GEONW_PON_GUC_BV_02_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(f_getPosition(c_compNodeA)),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_02_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GUC_BV_02)
                 */
                function f_GEONW_PON_GUC_BV_02_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_02_nodeD
                
            } // end GEONW_PON_GUC_BV_02
            
            group GEONW_PON_GUC_BV_03 {
                
                /**
                 * @desc    Test that the protocol header fields (RHL, PV) are correctly updated at each forwarding step
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC and
                 *      the IUT having received a GeoUnicast packet (GEOUNI1) originated by ItsNodeA
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoUnicast packet (GEOUNI2) addressed to ItsNodeA from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value greater than 1
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating value MHL1
                 *              containing GeoUnicast Extended Header
                 *                  containing DEPV field
                 *                      indicating position different from the SOPV value of GEOUNI1
                 *                  containing TST field
                 *                      indicating older value than the TimeStamp value of GEOUNI1
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop ITS station and
                 *          the IUT forwards GEOUNI2
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value decreased by 1 from the incoming value
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating value MHL1
                 *              containing GeoUnicast Extended Header
                 *                  containing DEPV field
                 *                      indicating same position as the SOPV value of GEOUNI1
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/03
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3
                 */
                testcase TC_GEONW_PON_GUC_BV_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_03_nodeB());
                    v_nodeC.start(f_GEONW_PON_GUC_BV_03_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_03)
                 */
                function f_GEONW_PON_GUC_BV_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    v_longPosVectorNodeA,
                                    f_longPosVector2ShortPosVector(f_getPosition(c_compIut)),
                                    vc_localSeqNumber
                                )
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacketWithHl(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?,
                                        c_defaultHopLimit
                                    ),
                                    -,
                                    c_defaultHopLimit - 1
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Forwarded GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        ?,
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: Fields not correctly updated ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_03)
                 */
                function f_GEONW_PON_GUC_BV_03_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_obsoleteLongPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    v_obsoleteLongPosVectorNodeA.timestamp := v_obsoleteLongPosVectorNodeA.timestamp - 1000;
                    v_obsoleteLongPosVectorNodeA.latitude := v_obsoleteLongPosVectorNodeA.latitude - 1;
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(v_obsoleteLongPosVectorNodeA),
                                    vc_localSeqNumber,
                                    c_defaultHopLimit
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_03_nodeC
                
            } // end GEONW_PON_GUC_BV_03
            
            group GEONW_PON_GUC_BV_04 {
                
                /**
                 * @desc  Test that the RHL restriction is correctly handled at the forwarding step
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating 1
                 *      }
                 *      then {
                 *          the IUT does not forward the GeoUnicast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/04
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3
                 */
                testcase TC_GEONW_PON_GUC_BV_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_04_nodeB());
                    v_nodeC.start(f_GEONW_PON_GUC_BV_04_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_04)
                 */
                function f_GEONW_PON_GUC_BV_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    ),
                                    -,
                                    ?
                                )
                            )
                        ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Forwarded GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                         
                } // end f_GEONW_PON_GUC_BV_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_04)
                 */
                function f_GEONW_PON_GUC_BV_04_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                1
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_04_nodeC
                
            } // end GEONW_PON_GUC_BV_04
            
            /**
             * @desc    Test that a received GeoUnicast packet is passed over the Gn SAP to the correct upper
             *          protocol if the Destination address matches the IUT address
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *    the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a GeoUnicast packet addressed to it
             *      }
             *      then {
             *          the IUT passes the received GeoUnicast packet to the correct Upper Layer protocol
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/05
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.8.4
             */
            testcase TC_GEONW_PON_GUC_BV_05() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                
                // Test adapter configuration
                
                // Preamble
                f_prDefault();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_gnPacket := m_geoNwPdu(
                                  m_geoNwUnicastPacket(
                                      f_getPosition(c_compNodeB),
                                      f_getIutShortPosVector(),
                                      vc_localSeqNumber
                                  )
                              );
                f_sendGeoNetMessage(m_geoNwReq_withLinkLayerDestination(v_gnPacket, f_getIutMacAddress()));
                
                f_sleep(PX_TAC);
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                    // empty on purpose 
                }
                if(i < lengthof(vc_utInds)) {
                    log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": FAIL: GN was not transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                
                // Postamble
                f_poDefault();
                f_cf01Down();
                
            } // end TC_GEONW_PON_GUC_BV_05
            
            group GEONW_PON_GUC_BV_06 {
                
                /**
                 * @desc    Test that a received GeoUnicast packet is forwarded at the correct time according to the
                 *          contention based forwarding rules
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC and
                 *      the distance between IUT and ItsNodeA being
                 *          less than itsGnDefaultMaxCommunicationRange MIB attribute
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value greater than 1
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the received GeoUnicast packet
                 *              upon expiry of calculated CBF delay (see note)
filatov's avatar
filatov committed
                 *      }
                 *  }
                 *  NOTE: The CBF delay timer value is calculated from the itsGnDefaultMaxCommunicationRange,
                 *        itsGnGeoUnicastCbfMinTime, and itsGnGeoUnicastCbfMaxTime MIB attributes, and the distance value
                 *        between IUT and ItsNodeC
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/06
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, Annex D.3
                 */
                testcase TC_GEONW_PON_GUC_BV_06() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var integer v_distance := f_getCbfMaxCommunicationRange() - 10;
                    var LongPosVector v_longPosVectorIut, v_longPosVectorNodeA;
                    
                    // Test control
                    if (f_getGeoUnicastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf03Up();
                    // re-compute NodeA's position.
                    v_longPosVectorIut := f_getIutLongPosVector();
                    v_longPosVectorNodeA := f_computePositionUsingDistance(v_longPosVectorIut, v_distance, 0);
                    v_longPosVectorNodeA.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_06_nodeB(v_distance, v_longPosVectorNodeA));
                    v_nodeC.start(f_GEONW_PON_GUC_BV_06_nodeC(v_longPosVectorNodeA));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_msgSent, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_06
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_06)
                 * @param   p_distanceToNodeA       Distance between IUT and NodeA
                 * @param   p_longPosVectorNodeA    Position vector of NodeA
filatov's avatar
filatov committed
                 */
                function f_GEONW_PON_GUC_BV_06_nodeB(in integer p_distanceToNodeA, in LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Local variables
                    timer t_toCbf := (int2float(f_getGeoUnicastCbfMaxTime())
                        + (
                            int2float(f_getGeoUnicastCbfMinTime() - f_getGeoUnicastCbfMaxTime())
                            / int2float(f_getCbfMaxCommunicationRange())
                        ) * int2float(p_distanceToNodeA)) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Message sent ***");
                    f_selfOrClientSyncAndVerdict(c_msgSent, e_success);
                    
                    tc_ac.start;
                    t_toCbf.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(p_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            if(t_toCbf.running) {
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: IUT re-broadcasted the packet too early ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: Forwarded GeoUnicast received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: Ready for receiving re-broadcasting ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_06_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_06)
                 * @param   p_longPosVectorNodeA    Position vector of NodeA
                 */
                function f_GEONW_PON_GUC_BV_06_nodeC(in LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(p_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    log("*** " & testcasename() & ": INFO: Message sent ***");
                    f_selfOrClientSyncAndVerdict(c_msgSent, e_success);
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(p_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Re-broadcasted GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_06_nodeC
                
            } // end GEONW_PON_GUC_BV_06
            
            group GEONW_PON_GUC_BV_07 {
                
                /**
                 * @desc    Test that a received GeoUnicast packet forwarding is correctly handling the minimum delay
                 *          value according to the contention based forwarding rules
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC and
                 *      the distance between IUT and ItsNodeA being
                 *          larger than the itsGnDefaultMaxCommunicationRange MIB attribute
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value greater than 1
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the received GeoUnicast packet
                 *              upon expiry of itsGnGeoUnicastCbfMinTime delay
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/07
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, Annex D.3
                 */
                testcase TC_GEONW_PON_GUC_BV_07() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var integer v_distance := f_getCbfMaxCommunicationRange() * 2;
                    var LongPosVector v_longPosVectorIut, v_longPosVectorNodeA;
                    
                    // Test control
                    if (f_getGeoUnicastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf03Up();
                    // re-compute NodeA's position.
                    v_longPosVectorIut := f_getIutLongPosVector();
                    v_longPosVectorNodeA := f_computePositionUsingDistance(v_longPosVectorIut, v_distance, 0);
                    v_longPosVectorNodeA.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_07_nodeB(v_longPosVectorNodeA));
                    v_nodeC.start(f_GEONW_PON_GUC_BV_07_nodeC(v_longPosVectorNodeA));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_msgSent, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_07
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_07)
                 * @param   p_longPosVectorNodeA    Position vector of NodeA
                 */
                function f_GEONW_PON_GUC_BV_07_nodeB(in LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Local variables
                    timer t_toCbf := int2float(f_getGeoUnicastCbfMinTime()) / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Message sent ***");
                    f_selfOrClientSyncAndVerdict(c_msgSent, e_success);
                    
                    tc_ac.start;
                    t_toCbf.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(p_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            if(t_toCbf.running) {
                            	t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: IUT re-broadcasted the packet too early ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: Forwarded GeoUnicast received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: Ready for receiving re-broadcasting ***");
                            repeat;
                        }
                        
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_07_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_07)
                 * @param   p_longPosVectorNodeA    Position vector of NodeA
                 */
                function f_GEONW_PON_GUC_BV_07_nodeC(LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(p_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    log("*** " & testcasename() & ": INFO: Message sent ***");
                    f_selfOrClientSyncAndVerdict(c_msgSent, e_success);
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(p_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Forwarded GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                      
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_07_nodeC
                
            } // end GEONW_PON_GUC_BV_07
            
            group GEONW_PON_GUC_BV_08 {
                
                /**
                 * @desc    Test that GeoUnicast packet forwarding correctly avoids packet duplication according to the
                 *          contention based forwarding rules
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC and
                 *      the distance between IUT and ItsNodeA being
                 *          less than the itsGnDefaultMaxCommunicationRange MIB attribute and
                 *      the IUT having received a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing RHL field
                 *                  indicating value greater than 1 and
                 *      the IUT having started a CBF timer for this packet (see note)
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet from ItsNodeD
                 *              before expiration of the CBF timer
                 *      }
                 *      then {
                 *          the IUT does not re-broadcast the received GeoUnicast packet
                 *      }
                 *  }
                 *  NOTE:    the CBF delay timer value is calculated from the itsGnDefaultMaxCommunicationRange,
                 *           itsGnGeoUnicastCbfMinTime, and itsGnGeoUnicastCbfMaxTime MIB attributes, and the
                 *           distance value between IUT and ItsNodeC
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/08
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, Annex D.3
                 */
                testcase TC_GEONW_PON_GUC_BV_08() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var integer v_distance := f_getCbfMaxCommunicationRange() - 10;
                    var LongPosVector v_longPosVectorIut, v_longPosVectorNodeA;
                    
                    // Test control
                    if (f_getGeoUnicastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf03Up();
                    // re-compute NodeA's position.
                    v_longPosVectorIut := f_getIutLongPosVector();
                    v_longPosVectorNodeA := f_computePositionUsingDistance(v_longPosVectorIut, v_distance, 0);
                    v_longPosVectorNodeA.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_08_nodeB(v_longPosVectorNodeA));
                    v_nodeC.start(f_GEONW_PON_GUC_BV_08_nodeC(v_longPosVectorNodeA));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_08
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_08)
                 * @param   p_longPosVectorNodeA    Position vector of NodeA
                 */
                function f_GEONW_PON_GUC_BV_08_nodeB(in LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleepIgnoreDef(int2float(f_getGeoUnicastCbfMaxTime())/2000.0);
                    
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(p_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit - 1
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(p_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Forwarded GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_08_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_08)
                 * @param   p_longPosVectorNodeA    Position vector of NodeA
                 */
                function f_GEONW_PON_GUC_BV_08_nodeC(in LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    //Note: Sending of the GeoUnicast packet move to test body in contrast to the test purpose due to time critical behaviour
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(p_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(p_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: Forwarded GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_08_nodeC
                
            } // end GEONW_PON_GUC_BV_08
            
            group GEONW_PON_GUC_BV_10 {
                
                /**
                 * @desc    Test that a received GeoUnicast packet is forwarded at the correct time according to the 
                 *          contention based forwarding rules when the sender is unknown
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT not having received any message from ItsNodeC and
                 *      the distance between IUT and ItsNodeA being
                 *          less than the itsGnDefaultMaxCommunicationRange MIB attribute and
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value greater than 1
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the received GeoUnicast packet
                 *              upon expiry of CBF_MAX
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/10
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, Annex D.3
                 */
                testcase TC_GEONW_PON_GUC_BV_10() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var integer v_distance := f_getCbfMaxCommunicationRange() - 10;
                    var LongPosVector v_longPosVectorIut, v_longPosVectorNodeA;
                    
                    // Test control
                    if (f_getGeoUnicastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf03Up();
                    // re-compute NodeA's position.
                    v_longPosVectorIut := f_getIutLongPosVector();
                    v_longPosVectorNodeA := f_computePositionUsingDistance(v_longPosVectorIut, v_distance, 0);
                    v_longPosVectorNodeA.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_10_nodeB(v_longPosVectorNodeA));
                    v_nodeC.start(f_GEONW_PON_GUC_BV_10_nodeC(v_longPosVectorNodeA));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_10
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_10)
                 * @param   p_longPosVectorNodeA    Position vector of NodeA
                 */
                function f_GEONW_PON_GUC_BV_10_nodeB(in LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sleepIgnoreDef(int2float(f_getGeoUnicastCbfMaxTime())/2000.0);
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(p_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Re-broadcasted GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_10_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_10)
                 * @param   p_longPosVectorNodeA    Position vector of NodeA
                 */
                function f_GEONW_PON_GUC_BV_10_nodeC(in LongPosVector p_longPosVectorNodeA) runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prDefault();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(p_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    
                    f_sleepIgnoreDef(int2float(f_getGeoUnicastCbfMaxTime())/2000.0);
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(p_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Re-broadcasted GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_10_nodeC
                
            } // end GEONW_PON_GUC_BV_10
9518 9519 9520 9521 9522 9523 9524 9525 9526 9527 9528 9529 9530 9531 9532 9533 9534 9535 9536 9537 9538 9539 9540 9541 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 9577 9578 9579 9580 9581 9582 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 9598 9599 9600 9601 9602 9603 9604 9605 9606 9607 9608 9609 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 9634 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9659 9660 9661 9662 9663 9664 9665 9666 9667 9668 9669 9670 9671 9672 9673 9674 9675 9676 9677 9678 9679 9680 9681 9682 9683 9684 9685 9686 9687 9688 9689 9690 9691 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703 9704 9705 9706 9707 9708 9709 9710 9711 9712 9713 9714 9715 9716 9717 9718 9719 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9741 9742 9743 9744 9745 9746 9747 9748 9749 9750 9751 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790 9791 9792 9793 9794 9795 9796 9797 9798 9799 9800 9801 9802 9803 9804 9805 9806 9807 9808 9809 9810 9811 9812 9813 9814 9815 9816 9817 9818 9819 9820 9821 9822 9823 9824 9825 9826 9827 9828 9829 9830 9831 9832 9833 9834 9835 9836 9837 9838 9839 9840 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 9856 9857 9858 9859 9860 9861 9862 9863 9864 9865 9866 9867 9868 9869 9870 9871 9872 9873 9874 9875 9876 9877 9878 9879 9880 9881 9882 9883 9884 9885 9886 9887 9888 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898 9899 9900 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030

            group GEONW_PON_GUC_BV_11 {
                
                /**
                 * @desc    Test that the reception of a unicast packet over upper Gn SAP triggers the origination of a GeoUnicast packet
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *  	the IUT being in the "initial state" and
                 *  	the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *  	when {
                 *  		the IUT is requested to send a GeoUnicast packet to ItsNodeB
                 *  	}
                 *  	then {
                 *  		the IUT broadcasts a GeoNetworking packet
                 *  			containing a correctly formatted Common Header
                 *  				containing HT field
                 *  					set to '2' (GEOUNICAST)
                 *  			containing GeoUnicast Extended Header
                 *  				containing DEPV field
                 *  					indicating same position as the SOPV value of the received Beacon information
                 *  	}
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/11
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.8.3, Annex D.3
                 */
                testcase TC_GEONW_PON_GUC_BV_11() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    if (f_getGeoUnicastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_11_nodeB());
                    v_nodeC.start(f_GEONW_PON_GUC_BV_11_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_11
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_11)
                 */
                function f_GEONW_PON_GUC_BV_11_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    if(not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeB.gnAddr))) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_11_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_11)
                 */
                function f_GEONW_PON_GUC_BV_11_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: broadcasted GeoUnicast received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoUnicast was not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_11_nodeC
                                
            } // end GEONW_PON_GUC_BV_11

            group GEONW_PON_GUC_BV_12 {
                
                /**
                 * @desc    Test that a received GUC packet is not triggering forwarding if received twice or more
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == ‘GREEDY’ OR 
                 * 				   PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == ‘UNSPECIFIED’
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *  	the IUT being in the "initial state" and
                 *  	the IUT having received Beacon information from ItsNodeC and
                 *  	the IUT having received Beacon information from ItsNodeB and
                 *  	the IUT having received a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *  		containing TrafficClass.SCF set to 1
                 *  		containing Basic Header
                 *  			containing RHL field
                 *  				indicating value greater than 1 and
                 *  	the IUT having forwarded the GUC packet
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *  	when {
                 *  		the IUT receives the same GUC packet from ItsNodeB
                 *  			containing Basic Header
                 *  				containing RHL field
                 *  					indicating HL1 - 1
                 *  	}
                 *  	then {
                 *  		the IUT does forward the packet
                 *  	}
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/12
                 * @reference   EN 302 636-4-1 [1], clause 9.3.9.3
                 */
                testcase TC_GEONW_PON_GUC_BV_12() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    if ((f_getGeoUnicastForwardingAlgorithm() != e_greedy) and (f_getGeoUnicastForwardingAlgorithm() != e_unspecified)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == (e_greedy  or e_unspecified) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_12_nodeB());
                    v_nodeC.start(f_GEONW_PON_GUC_BV_12_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_12
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_12)
                 */
                function f_GEONW_PON_GUC_BV_12_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": INFO: First GeoUnicast forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: First GeoUnicast was not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                        }
                    }
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit - 1
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Duplicate GeoUnicast was forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: Duplicate GeoUnicast not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);                            
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_12_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_12)
                 */
                function f_GEONW_PON_GUC_BV_12_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(v_longPosVectorNodeA),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            )
                        ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Duplicate GeoUnicast was forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: Duplicate GeoUnicast not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);                            
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_12_nodeC
                
            } // end GEONW_PON_GUC_BV_12

            group GEONW_PON_GUC_BV_13 {
                
                /**
                 * @desc    Test that a received GUC packet is not passed over the Gn SAP to the correct upper protocol
                 * 			when the Destination address matches the IUT address if received twice or more
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == ‘GREEDY’ OR 
                 * 				   PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == ‘UNSPECIFIED’
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *  	the IUT being in the "initial state" and
                 *  	the IUT having received Beacon information from ItsNodeC and
                 *  	the IUT having received Beacon information from ItsNodeB and
                 *  	the IUT having received a GeoUnicast packet addressed to IUT from ItsNodeC
                 *  		containing TrafficClass.SCF set to 1
                 *  		containing Basic Header
                 *  			containing RHL field
                 *  				indicating value greater than 1 and
                 *  	the IUT having forwarded the GUC packet
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *  	when {
                 *  		the IUT receives the same GUC packet from ItsNodeB
                 *  			containing Basic Header
                 *  				containing RHL field
                 *  					indicating HL1 - 1
                 *  	}
                 *  	then {
                 *  		the IUT does not pass the received GUC packet to any Upper Layer protocol
                 *  	}
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GUC/BV/13
                 * @reference   EN 302 636-4-1 [1], clause 9.3.9.3
                 */
                testcase TC_GEONW_PON_GUC_BV_13() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    if ((f_getGeoUnicastForwardingAlgorithm() != e_greedy) and (f_getGeoUnicastForwardingAlgorithm() != e_unspecified)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == (e_greedy  or e_unspecified) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf03Up(c_compNodeB);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GUC_BV_13_nodeB());
                    v_nodeC.start(f_GEONW_PON_GUC_BV_13_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GUC_BV_13
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GUC_BV_13)
                 */
                function f_GEONW_PON_GUC_BV_13_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var integer i;
                    var template (present) GeoNetworkingPdu v_gnPacket := m_geoNwPdu(
                        m_geoNwUnicastPacket(
                            f_getPosition(c_compNodeC),
                            f_longPosVector2ShortPosVector(v_longPosVectorIut),
                            vc_localSeqNumber
                        ),
                        -,
                        c_defaultHopLimit - 1
                    );                                        
                                        
                    // Preamble
                    f_prNeighbour();
                    f_sleep(PX_TAC);
                    for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                        // empty on purpose 
                    }
                    if(i < lengthof(vc_utInds)) {
                        log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
                        //flush received upper indications 
                        vc_utInds := {};
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    }
                    else {
                        log("*** " & testcasename() & ": INCONC: GN was not transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_error);
                    }
                    
                    // Test Body
                    f_sendGeoNetMessage(m_geoNwReq_withLinkLayerDestination(valueof(v_gnPacket), f_getIutMacAddress()));
                   
                    f_sleep(PX_TAC);
                    for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                        // empty on purpose 
                    }
                    if(i < lengthof(vc_utInds)) {
                        log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    else {
                        log("*** " & testcasename() & ": FAIL: GN was not transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_13_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GUC_BV_13)
                 */
                function f_GEONW_PON_GUC_BV_13_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(
                                m_geoNwUnicastPacket(
                                    f_getPosition(c_compNodeC),
                                    f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                    vc_localSeqNumber
                                ),
                                -,
                                c_defaultHopLimit
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GUC_BV_13_nodeC
                
            } // end GEONW_PON_GUC_BV_13
                        
filatov's avatar
filatov committed
        } // end geoGeoUnicast
        
        // 6.2.2.9
        group geoGeoBroadcast {
            
            group GEONW_PON_GBC_BV_01 {
                
                /**
                 * @desc    Test that the reception of a broadcast indication over upper Gn SAP triggers the origination of a
                 *          GeoBroadcast packet's broadcasting if the IUT is within the Destination Area
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoBroadcast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      }
                 *      then {
                 *          the IUT broadcasts immediately the GeoBroadcast packet
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/01
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.2
                 */
                testcase TC_GEONW_PON_GBC_BV_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_01_nodeB());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_01_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GBC_BV_01
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_01)
                 */
                function f_GEONW_PON_GBC_BV_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
	                if ( not f_utTriggerEvent(m_generateGeoBroadcastMessage(f_getArea(c_area1))) ) {
	                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
	                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
	                }
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoBroadcastArea(c_area1)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_01)
                 */
                function f_GEONW_PON_GBC_BV_01_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoBroadcastArea(c_area1)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_01_nodeD
                
            } // end GEONW_PON_GBC_BV_01
            
            group GEONW_PON_GBC_BV_02 {
                
                /**
                 * @desc    Test that the reception of a broadcast indication over upper Gn SAP triggers the origination of a
                 *          GeoBroadcast packet's line forwarding if the IUT is outside the Destination Area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'SIMPLE' OR 
                 * 				   PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'UNSPECIFIED' OR
                 * 				   PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
filatov's avatar
filatov committed
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoBroadcast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop ITS station and
                 *          the IUT sends the GeoBroadcast packet (see note)
                 *      }
                 *  }
                 *  NOTE: Next hop ITS Station being identified by the MAC layer address of ItsNodeB
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/02
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.2, Annex E.2
                 */
                testcase TC_GEONW_PON_GBC_BV_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if ((f_getGeoBroadcastForwardingAlgorithm() != e_simple) and (f_getGeoBroadcastForwardingAlgorithm() != e_unspecified) and (f_getGeoBroadcastForwardingAlgorithm() != e_advanced)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_simple or e_unspecified ) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                                        
filatov's avatar
filatov committed
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_02_nodeB());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_02_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GBC_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_02)
                 */
                function f_GEONW_PON_GBC_BV_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if ( not f_utTriggerEvent(m_generateGeoBroadcastMessage(f_getArea(c_area2))) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoBroadcastArea(c_area2)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_02)
                 */
                function f_GEONW_PON_GBC_BV_02_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoBroadcastArea(c_area2)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: received GeoBroadcast message ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_02_nodeD
                
            } // end GEONW_PON_GBC_BV_02
            
            group GEONW_PON_GBC_BV_03 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering re-broadcasting if received for the first
                 *          time within its destination area
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      }
                 *      then {
                 *          the IUT re-broadcasts immediately the GeoBroadcast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/03
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3, Annex E.2
                 */
                testcase TC_GEONW_PON_GBC_BV_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if ((f_getGeoBroadcastForwardingAlgorithm() != e_simple) and (f_getGeoBroadcastForwardingAlgorithm() != e_unspecified)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_simple or e_unspecified ) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_03_nodeB());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_03_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GBC_BV_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_03)
                 */
                function f_GEONW_PON_GBC_BV_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeB,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_03)
                 */
                function f_GEONW_PON_GBC_BV_03_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_03_nodeD
                
            } // end GEONW_PON_GBC_BV_03
            
            group GEONW_PON_GBC_BV_04 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is not triggering re-broadcasting if received for
                 *          the second or more time (duplicate packet detection)
                 * <pre>
                 * Pics Selection:  PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'SIMPLE' 
                 *                  OR PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'UNSPECIFIED'
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a GeoBroadcast packet from ItsNodeB
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing RHL field
                 *                  indicating value HL1 higher than 1
                 *          containing GBC Extended Header
                 *              containing SN field
                 *                  indicating value SN1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1 and
                 *      the IUT having re-broadcast the GeoBroadcast packet
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet from ItsNodeD
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value lower than HL1
                 *              containing GBC Extended Header
                 *                  containing SN field
                 *                      indicating value SN1
                 *      }
                 *      then {
                 *          the IUT does not re-broadcast the GeoBroadcast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/04
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3, Annex A.2
                 */
                testcase TC_GEONW_PON_GBC_BV_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if ((f_getGeoBroadcastForwardingAlgorithm() != e_simple) and (f_getGeoBroadcastForwardingAlgorithm() != e_unspecified)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_simple or e_unspecified ) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);                    
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_04_nodeB());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_04_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GBC_BV_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_04)
                 */
                function f_GEONW_PON_GBC_BV_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (present) GeoNetworkingPdu v_gnPacket;
                    
                    // Preamble
                    f_prNeighbour();
                    v_gnPacket := m_geoNwPdu(
                                      m_geoNwBroadcastPacket(
                                          v_longPosVectorNodeB,
                                          vc_localSeqNumber,
                                          f_getGeoBroadcastArea(c_area1)
                                      ),
                                      -,
                                      c_defaultHopLimit
                                  );
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(valueof(v_gnPacket)));
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoBroadcast(
                                ?,
                                ?) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_04)
                 */
                function f_GEONW_PON_GBC_BV_04_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (present) GeoNetworkingInd v_msgInd;
                    
                    // Preamble
                    f_prNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) -> value v_msgInd {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Pre-conditions: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Test Body
                    // send geoBroadcast for second time (same source + same seq Nr + lower RHL)
                    v_msgInd.msgIn.basicHeader.routerHopLimit := valueof(v_msgInd.msgIn.basicHeader.routerHopLimit) - 1;
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(valueof(v_msgInd.msgIn)));
                    
                    v_msgInd.msgIn.basicHeader.routerHopLimit := ?;
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoBroadcast(
                                ?,
                                ?) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_04_nodeD
                
            } // end GEONW_PON_GBC_BV_04
            
            group GEONW_PON_GBC_BV_05 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering line forwarding if received out of its
                 *          destination area for the first time from a known ITS-Station
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD and
				 *      the IUT having received Beacon information from ItsNodeC
filatov's avatar
filatov committed
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet generated by ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop ITS station and
                 *          the IUT forwards the GeoBroadcast packet (see note)
                 *      }
                 *  }
                 *  NOTE: Next hop ITS Station being identified by the MAC layer address of ItsNodeB
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/05
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3, Annex E.2
                 */
                testcase TC_GEONW_PON_GBC_BV_05() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_05_nodeB());
                    v_nodeC.start(f_GEONW_PON_GBC_BV_05_nodeC());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_05_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GBC_BV_05
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_05)
                 */
                function f_GEONW_PON_GBC_BV_05_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message correctly forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_05_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GBC_BV_05)
                 */
                function f_GEONW_PON_GBC_BV_05_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoNetworkingInd v_msgInd;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_05_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_05)
                 */
                function f_GEONW_PON_GBC_BV_05_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_05_nodeD
                
            } // end GEONW_PON_GBC_BV_05
            
            group GEONW_PON_GBC_BV_06 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is not triggering line forwarding if received out of its
                 *          destination area for the second or more time
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'SIMPLE' OR 
                 * 				   PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'UNSPECIFIED'
filatov's avatar
filatov committed
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD
                 *      the IUT having received a GeoBroadcast packet from ItsNodeC
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing RHL field
                 *                  indicating value HL1 higher than 1
                 *          containing GBC Extended Header
                 *              containing SN field
                 *                  indicating value SN1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      the IUT having forwarded the received GeoBroadcast packet
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet from ItsNodeD
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value lower than HL1
                 *              containing GBC Extended Header
                 *                  containing SN field
                 *                      indicating value SN1
                 *      }
                 *      then {
                 *          the IUT does not forward the received GeoBroadcast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/06
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3
                 */
                testcase TC_GEONW_PON_GBC_BV_06() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    var UInt16 v_sequenceNumber := f_getInitialSequenceNumber();
                    
                    // Test control
                    if ((f_getGeoBroadcastForwardingAlgorithm() != e_simple) and (f_getGeoBroadcastForwardingAlgorithm() != e_unspecified)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_simple or e_unspecified ) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
filatov's avatar
filatov committed
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_06_nodeB());
                    v_nodeC.start(f_GEONW_PON_GBC_BV_06_nodeC(v_sequenceNumber));
                    v_nodeD.start(f_GEONW_PON_GBC_BV_06_nodeD(v_sequenceNumber));
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GBC_BV_06
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_06)
                 */
                function f_GEONW_PON_GBC_BV_06_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var template (present) GeoNetworkingInd v_msgInd;
                    
                    // Preamble
                    f_prNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) -> value v_msgInd {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: GeoBroadcast message correctly forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Test Body
                    v_msgInd.msgIn.basicHeader.routerHopLimit := ?;
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(v_msgInd) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message re-forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not re-forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_06_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GBC_BV_06)
                 */
                function f_GEONW_PON_GBC_BV_06_nodeC(in UInt16 p_sequenceNumber) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    p_sequenceNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_06_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_06)
                 */
                function f_GEONW_PON_GBC_BV_06_nodeD(in UInt16 p_sequenceNumber) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: GeoBroadcast message not forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: Pre-conditions: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Test Body
                    // send geoBroadcast for second time (same source + same seq Nr + lower RHL)
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    p_sequenceNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                ),
                                -,
                                c_defaultHopLimit - 1
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast re-forwarded! (not to area center!) ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_06_nodeD
                
            } // end GEONW_PON_GBC_BV_06
            
            group GEONW_PON_GBC_BV_07 {
                
                /**
                 * @desc    Test that the protocol header fields (RHL) are correctly updated during a GeoBroadcast re-
                 *          broadcasting step
                 * <pre>
filatov's avatar
filatov committed
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value HL1 higher than 1
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating value MHL1
                 *              containing GeoBroadcast DestinationArea
                 *                      indicating AREA1
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the GeoBroadcast packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value (HL1 -1)
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating value MHL1
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/07
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3
                 */
                testcase TC_GEONW_PON_GBC_BV_07() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_07_nodeB());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_07_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GBC_BV_07
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_07)
                 */
                function f_GEONW_PON_GBC_BV_07_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeB,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area1),
                                    c_defaultHopLimit
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithAreaWithHopLimit(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1),
                                c_defaultHopLimit - 1,
                                c_defaultHopLimit) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message correctly re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_07_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_07)
                 */
                function f_GEONW_PON_GBC_BV_07_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var GeoNetworkingInd v_msgInd;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithAreaWithHopLimit(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1),
                                c_defaultHopLimit - 1,
                                c_defaultHopLimit) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message correctly re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_07_nodeD
                
            } // end GEONW_PON_GBC_BV_07
            
            group GEONW_PON_GBC_BV_08 {
                
                /**
                 * @desc    Test that the RHL restriction is correctly handled at a GeoBroadcast re-broadcasting step
                 * <pre>
filatov's avatar
filatov committed
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA1
                 *      }
                 *      then {
                 *          the IUT does not re-broadcast the GeoBroadcast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/08
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3
                 */
                testcase TC_GEONW_PON_GBC_BV_08() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
filatov's avatar
filatov committed
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_08_nodeB());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_08_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GBC_BV_08
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_08)
                 */
                function f_GEONW_PON_GBC_BV_08_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeB,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area1)
                                ),
                                -,
                                c_hopLimit1
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoBroadcast(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_08_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_08)
                 */
                function f_GEONW_PON_GBC_BV_08_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoBroadcast(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_08_nodeD
                
            } // end GEONW_PON_GBC_BV_08
            
            /**
             * @desc    Test that a received GeoBroadcast packet is passed over the Gn SAP to the correct upper
             *          protocol if it is received for the first time within the GeoBroadcast destination area
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a GeoBroadcast packet
             *              containing TrafficClass.SCF set to 1
             *              containing GeoBroadcast DestinationArea
             *                  indicating AREA1
             *      }
             *      then {
             *          the IUT passes the received GeoBroadcast packet to the correct Upper Layer protocol
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/09
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3
             */
            testcase TC_GEONW_PON_GBC_BV_09() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_gnPacket := m_geoNwPdu(m_geoNwBroadcastPacket(
                                            v_longPosVectorNodeB,
                                            vc_localSeqNumber,
                                            f_getGeoBroadcastArea(c_area1)
                                        )
                                    );
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                
                f_sleep(PX_TAC);
                
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                    // empty on purpose 
                }
                if(i < lengthof(vc_utInds)) {
                    log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": FAIL: GN was not transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_GBC_BV_09
            
            group GEONW_PON_GBC_BV_10 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is not passed over the Gn SAP if it is received for the
                 *          second or more time
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'SIMPLE' OR 
                 * 				   PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'UNSPECIFIED'
filatov's avatar
filatov committed
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a GeoBroadcast packet from ItsNodeB
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing RHL field
                 *                  indicating HL1
                 *          containing GBC Extended Header
                 *              containing SN field
                 *                  indicating value SN1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1 and
                 *      the IUT having passed the received GeoBroadcast packet to the correct Upper Layer protocol
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet from ItsNodeD
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value lower than HL1
                 *                  containing SN field
                 *                      indicating value SN1
                 *      }
                 *      then {
                 *          the IUT does not pass the received GeoBroadcast packet to any Upper Layer protocol
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/10
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_GBC_BV_10() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if ((f_getGeoBroadcastForwardingAlgorithm() != e_simple) and (f_getGeoBroadcastForwardingAlgorithm() != e_unspecified)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_simple or e_unspecified ) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
filatov's avatar
filatov committed
                    
                    // Test component configuration
                    f_cf02Up(c_compNodeB);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_10_nodeB());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_10_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GBC_BV_10
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_10)
                 */
                function f_GEONW_PON_GBC_BV_10_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (present) GeoNetworkingPdu v_gnPacket;
                    var integer i;
                    
                    // Preamble
                    f_prNeighbour();
                    v_gnPacket := m_geoNwPdu(m_geoNwBroadcastPacket(
                                                v_longPosVectorNodeB,
                                                vc_localSeqNumber,
                                                f_getGeoBroadcastArea(c_area1)
                                            ),
                                            -,
                                            c_defaultHopLimit
                                        );
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(valueof(v_gnPacket)));
                    
                    // IUT should also rebroadcast the packet. Get ready
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": INFO: GeoBroadcast message rebroadcasted ***");
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INFO: GeoBroadcast message not rebroadcasted ***");
                        }
                    }
                    
                    f_sleep(PX_TAC);
                    for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                        // empty on purpose 
                    }
                    if(i < lengthof(vc_utInds)) {
                        log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
	                    //flush received upper indications 
	                    vc_utInds := {};
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    }
                    else {
                        log("*** " & testcasename() & ": INCONC: GN was not transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_error);
                    v_gnPacket.basicHeader.routerHopLimit := valueof(v_gnPacket.basicHeader.routerHopLimit) / 2;
filatov's avatar
filatov committed
                    f_sleep(PX_TAC);
                    for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                        // empty on purpose 
                    }
                    if(i < lengthof(vc_utInds)) {
                        log("*** " & testcasename() & ": FAIL: GN was transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    else {
                        log("*** " & testcasename() & ": PASS: GN was NOT transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_10_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_10)
                 */
                function f_GEONW_PON_GBC_BV_10_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (value) GeoNetworkingInd v_msgInd;
                    var integer i;
                    
                    // Preamble
                    f_prNeighbour();
                    
                    // IUT should also rebroadcast the packet. Get ready
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) -> value v_msgInd {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": INFO: Pre-conditions: GeoBroadcast message rebroadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INFO: Pre-conditions: GeoBroadcast message not rebroadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    v_msgInd.msgIn.basicHeader.routerHopLimit := valueof(v_msgInd.msgIn.basicHeader.routerHopLimit) / 2;
filatov's avatar
filatov committed
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_msgInd.msgIn));
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_10_nodeD
                
            } // end GEONW_PON_GBC_BV_10
            
            /**
             * @desc    Test that a received GeoBroadcast packet is not passed over the Gn SAP if it is received for the
             *          first time outside the  GeoBroadcast destination area
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having received Beacon information from ItsNodeB
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a GeoBroadcast packet
             *              containing TrafficClass.SCF set to 1
             *              containing GeoBroadcast DestinationArea
             *                  indicating AREA2
             *      }
             *      then {
             *          the IUT does not pass the received GeoBroadcast packet to any Upper Layer protocol
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/11
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3
             */
            testcase TC_GEONW_PON_GBC_BV_11() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_gnPacket := m_geoNwPdu(m_geoNwBroadcastPacket(
                                            v_longPosVectorNodeB,
                                            vc_localSeqNumber,
                                            f_getGeoBroadcastArea(c_area2)
                                        )
                                    );
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                
                f_sleep(PX_TAC);
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                    // empty on purpose 
                }
                if(i < lengthof(vc_utInds)) {
                    log("*** " & testcasename() & ": FAIL: GN was transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": PASS: GN was NOT transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_GBC_BV_11
            
            group GEONW_PON_GBC_BV_12 {
                
                /**
                 * @desc    Test that the reception of a broadcast indication over upper Gn SAP triggers the origination of a
                 *          Simple GeoBroadcast if this method is selected in the MIB
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection:  PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF' 
filatov's avatar
filatov committed
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
filatov's avatar
filatov committed
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoBroadcast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      }
                 *      then {
                 *          the IUT broadcasts immediately the GeoBroadcast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/12
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.2, Annex D.2
                 */
                testcase TC_GEONW_PON_GBC_BV_12() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if ((f_getGeoBroadcastForwardingAlgorithm() != e_cbf)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_cbf ) required for executing the TC ***");
filatov's avatar
filatov committed
                        setverdict(inconc);
                        stop;
                    }
filatov's avatar
filatov committed
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_12_nodeB());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_12_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GBC_BV_12
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_12)
                 */
                function f_GEONW_PON_GBC_BV_12_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if ( not f_utTriggerEvent(m_generateGeoBroadcastMessage(f_getArea(c_area1))) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoBroadcastArea(c_area1)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_12_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_12)
                 */
                function f_GEONW_PON_GBC_BV_12_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoBroadcastArea(c_area1)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_12_nodeD
                
            } // end GEONW_PON_GBC_BV_12
                        
            group GEONW_PON_GBC_BV_19 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is discarded when indicating a too big GeoArea
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB
                 *      the IUT having received Beacon information from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing DestinationArea
                 *                  indicating a geoArea bigger than itsGnMaxGeoAreaSize
                 *      }
                 *      then {
                 *          the IUT does not forward the received GeoBroadcast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/19
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex B.3
                 */
                testcase TC_GEONW_PON_GBC_BV_19() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    var UInt16 v_distanceTooBig;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf04Up();
                    v_distanceTooBig := float2int(1.1 * f_radiusFromCircularArea(f_getGnMaxAreaSize()*c_squareKm));
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_19_nodeB(v_distanceTooBig));
                    v_nodeC.start(f_GEONW_PON_GBC_BV_19_nodeC(v_distanceTooBig));
                    v_nodeD.start(f_GEONW_PON_GBC_BV_19_nodeD(v_distanceTooBig));
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GBC_BV_19
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_19)
                 */
                function f_GEONW_PON_GBC_BV_19_nodeB(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_getPosition(c_compNodeB), 
                        p_distanceTooBig
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_geoArea2GeoBroadcastArea(v_areaTooBig)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_19_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GBC_BV_19)
                 */
                function f_GEONW_PON_GBC_BV_19_nodeC(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_getPosition(c_compNodeB), 
                        p_distanceTooBig
                    );
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_geoArea2GeoBroadcastArea(v_areaTooBig)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_19_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_19)
                 */
                function f_GEONW_PON_GBC_BV_19_nodeD(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_getPosition(c_compNodeB), 
                        p_distanceTooBig
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_geoArea2GeoBroadcastArea(v_areaTooBig)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_19_nodeD
                
            } // end GEONW_PON_GBC_BV_19
            
            group GEONW_PON_GBC_BV_20 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering rebroadcast if received out of its 
                 *          destination area for the first time from an unknown sender
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT not having received any message from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet generated by ItsNodeC from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the GeoBroadcast packet immediately
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/20
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3, Annex E.2, E3 and E.4
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_GBC_BV_20() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_20_nodeB());
                    v_nodeC.start(f_GEONW_PON_GBC_BV_20_nodeC());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_20_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GBC_BV_20
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_20)
                 */
                function f_GEONW_PON_GBC_BV_20_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_20_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GBC_BV_20)
                 */
                function f_GEONW_PON_GBC_BV_20_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_20_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_20)
                 */
                function f_GEONW_PON_GBC_BV_20_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_20_nodeD
                
            } // end GEONW_PON_GBC_BV_20
            
            group GEONW_PON_GBC_BV_21 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering rebroadcast if received out of its 
                 *          destination area for the first time from a known sender with PAI=0
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD
                 *          containing SOPV.PAI indicating 0
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet generated by ItsNodeC from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the GeoBroadcast packet immediately
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GBC/BV/21
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.11.3, Annex E.2, E.3 and E.4
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_GBC_BV_21() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GBC_BV_21_nodeB());
                    v_nodeC.start(f_GEONW_PON_GBC_BV_21_nodeC());
                    v_nodeD.start(f_GEONW_PON_GBC_BV_21_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GBC_BV_21
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GBC_BV_20)
                 */
                function f_GEONW_PON_GBC_BV_21_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_21_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GBC_BV_21)
                 */
                function f_GEONW_PON_GBC_BV_21_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_21_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GBC_BV_21)
                 */
                function f_GEONW_PON_GBC_BV_21_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                    
                    // Preamble
                    v_longPosVectorNodeD.pai := int2bit(0,1);
                    f_changePositon(c_compNodeD, v_longPosVectorNodeD); 
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GBC_BV_21_nodeD
                
            } // end GEONW_PON_GBC_BV_21
            
        } // end geoGeoBroadcast
        
        // 6.2.2.10
        group geoTopologicallyScopedBroadcast {
            
            group GEONW_PON_TSB_BV_01 {
                /**
                 * @desc    Test that the reception of a TSB indication over upper Gn SAP triggers the origination of a TSB
                 *          packet
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a TSB packet
                 *      }
                 *      then {
                 *          the IUT broadcasts a TSB packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/TSB/BV/01
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.9.2
                 */
                testcase TC_GEONW_PON_TSB_BV_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_TSB_BV_01_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BV_01_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_TSB_BV_01
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_01)
                 */
                function f_GEONW_PON_TSB_BV_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if ( not f_utTriggerEvent(m_generateTsbMessage) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(?, mw_longPosVectorPosition(v_longPosVectorIut))
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: TSB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_01)
                 */
                function f_GEONW_PON_TSB_BV_01_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(?, mw_longPosVectorPosition(v_longPosVectorIut))
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: TSB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_01_nodeD
                
            } // end GEONW_PON_TSB_BV_01
            
            group GEONW_PON_TSB_BV_02 {
                
                /**
                 * @desc    Test that a received TSB packet is triggering re-broadcasting if received for the first time
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a TSB packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating HL1 higher than 1
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the TSB packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/TSB/BV/02
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.9.3
                 */
                testcase TC_GEONW_PON_TSB_BV_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);                    
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_TSB_BV_02_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BV_02_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_TSB_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_02)
                 */
                function f_GEONW_PON_TSB_BV_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwTsbPacket(
                                    vc_localSeqNumber,
                                    v_longPosVectorNodeB
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: TSB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_02)
                 */
                function f_GEONW_PON_TSB_BV_02_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: TSB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_02_nodeD
                
            } // end GEONW_PON_TSB_BV_02
            
            group GEONW_PON_TSB_BV_03 {
                
                /**
                 * @desc    Test that a received TSB packet is not triggering re-broadcasting if received for the second or
                 *          more time
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received a TSB packet from ItsNodeB
                 *          containing Basic Header
                 *              containing RHL field
                 *                  indicating HL1 higher than 1
                 *          containing TSB Extended Header
                 *              containing SN field
                 *                  indicating value SN1 and
                 *      the IUT having re-broadcast the TSB packet
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same TSB packet from ItsNodeD
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating HL1 - 1
                 *              containing TSB Extended Header
                 *                  containing SN field
                 *                      indicating value SN1
                 *      }
                 *      then {
                 *          the IUT does not re-broadcast the TSB packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/TSB/BV/03
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.9.3
                 */
                testcase TC_GEONW_PON_TSB_BV_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_TSB_BV_03_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BV_03_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_TSB_BV_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_03)
                 */
                function f_GEONW_PON_TSB_BV_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (present) GeoNetworkingPdu v_gnPacket;
                    
                    // Preamble
                    f_prNeighbour();
                    v_gnPacket := m_geoNwPdu(
                                      m_geoNwTsbPacket(
                                          vc_localSeqNumber,
                                          v_longPosVectorNodeB
                                      ),
                                      -,
                                      c_defaultHopLimit
                                  );
                    
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(valueof(v_gnPacket)));
                    v_gnPacket.basicHeader.routerHopLimit := ?;
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        []  geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: The same TSB packet was re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: The same TSB packet was not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_03)
                 */
                function f_GEONW_PON_TSB_BV_03_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (value) GeoNetworkingInd v_msgInd;
                    
                    // Preamble
                    f_prNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) -> value v_msgInd {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    v_msgInd.msgIn.basicHeader.routerHopLimit := valueof(v_msgInd.msgIn.basicHeader.routerHopLimit) -1;
filatov's avatar
filatov committed
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_msgInd.msgIn));
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(v_msgInd) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: The same TSB packet was re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: The same TSB packet was not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_03_nodeD
                
            } // end GEONW_PON_TSB_BV_03
            
            group GEONW_PON_TSB_BV_04 {
                
                /**
                 * @desc    Test that the protocol header fields (RHL) are correctly updated during a TSB re-
                 *          broadcasting step
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a TSB packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating HL1
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating value MHL1
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the TSB packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value (HL1 -1)
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating value MHL1
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/TSB/BV/04
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.9.3
                 */
                testcase TC_GEONW_PON_TSB_BV_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);                    
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_TSB_BV_04_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BV_04_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_TSB_BV_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_04)
                 */
                function f_GEONW_PON_TSB_BV_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwTsbPacket(
                                    vc_localSeqNumber,
                                    v_longPosVectorNodeB,
                                    c_defaultHopLimit
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        ),
                                        -,
                                        c_defaultHopLimit - 1
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: TSB packet received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        ),
                                        -,
                                        ?
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: TSB packet received with incorrect HopLimit ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_04)
                 */
                function f_GEONW_PON_TSB_BV_04_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacketWithHl(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB),
                                            c_defaultHopLimit
                                        ),
                                        -,
                                        c_defaultHopLimit - 1
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: TSB packet received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        ),
                                        -,
                                        ?
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: TSB packet received with incorrect HopLimit ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_04_nodeD
                
            } // end GEONW_PON_TSB_BV_04
            
            group GEONW_PON_TSB_BV_05 {
                
                /**
                 * @desc    Test that the RHL restriction is correctly handled at a TSB re-broadcasting step
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state"
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a TSB packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating 1
                 *      }
                 *      then {
                 *          the IUT does not re-broadcast the TSB packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/TSB/BV/05
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.9.3
                 */
                testcase TC_GEONW_PON_TSB_BV_05() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);                    
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_TSB_BV_05_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BV_05_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_TSB_BV_05
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_05)
                 */
                function f_GEONW_PON_TSB_BV_05_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwTsbPacket(
                                    vc_localSeqNumber,
                                    v_longPosVectorNodeB
                                ),
                                -,
                                1
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_05_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_05)
                 */
                function f_GEONW_PON_TSB_BV_05_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: TSB message was re-broadcasted  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: TSB message was not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_05_nodeD
                
            } // end GEONW_PON_TSB_BV_05
            
            /**
             * @desc  Test that a received TSB packet is passed over the Gn SAP to the correct upper protocol if it is
             *        received for the first time
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *    the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *    when {
             *      the IUT receives a TSB packet
             *    }
             *    then {
             *      the IUT passes the received TSB packet to the correct Upper Layer protocol
             *    }
             *  }
             * </pre>
             *
             * @see     ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/TSB/BV/06
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.9.3
             */
            testcase TC_GEONW_PON_TSB_BV_06() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prDefault();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_gnPacket := m_geoNwPdu(m_geoNwTsbPacket(
                                            vc_localSeqNumber,
                                            v_longPosVectorNodeB
                                        )
                                    );
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                
                f_sleep(PX_TAC);
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                    // empty on purpose 
                }
                if(i < lengthof(vc_utInds)) {
                    log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": FAIL: GN was not transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                
                log("*** " & testcasename() & ": TSB packet passed to Upper Layer  ***");
                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                
                // Postamble
                f_poDefault();
                f_cf01Down();
                
            } // end TC_GEONW_PON_TSB_BV_06
            
            group GEONW_PON_TSB_BV_07 {
                
                /**
                 * @desc    Test that a received TSB packet is not passed over the Gn SAP if it is received for the second
                 *          or more time
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a TSB packet from ItsNodeB
                 *          containing Basic Header
                 *              containing RHL field
                 *                  indicating HL1 higher than 1
                 *          containing TSB Extended Header
                 *              containing SN field
                 *                  indicating value SN1 and
                 *      the IUT having passed the received TSB packet to the correct Upper Layer protocol
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same TSB packet from ItsNodeD
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating HL1 - 1
                 *              containing TSB Extended Header
                 *                  containing SN field
                 *                      indicating value SN1
                 *      }
                 *      then {
                 *          the IUT does not pass the received TSB packet to any Upper Layer protocol
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/TSB/BV/07
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.9.3
                 */
                testcase TC_GEONW_PON_TSB_BV_07() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up(c_compNodeB);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_TSB_BV_07_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BV_07_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_TSB_BV_07
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_07)
                 */
                function f_GEONW_PON_TSB_BV_07_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (value) GeoNetworkingPdu v_gnPacket;
                    var integer i;
                    
                    // Preamble
                    f_prNeighbour();
                    v_gnPacket := m_geoNwPdu(m_geoNwTsbPacket(
                                                vc_localSeqNumber,
                                                v_longPosVectorNodeB
                                            ),
                                            -,
                                            c_defaultHopLimit
                                        );
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(valueof(v_gnPacket)));
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            
                            f_sleep(PX_TAC);
                            for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                                // empty on purpose 
                            }
                            if(i < lengthof(vc_utInds)) {
                                log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly rebroadcasted and passed to Upper Layer ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": INCONC: TSB was not transmitted to upper layer ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: TSB not rebroadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Test Body
                    f_sleep(PX_TAC);
                    for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                        // empty on purpose 
                    }
                    if(i < lengthof(vc_utInds)) {
                        log("*** " & testcasename() & ": FAIL: Same TSB packet was transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    else {
                        log("*** " & testcasename() & ": PASS: Same TSB packet was not passed to Upper Layer  ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_07_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_07)
                 */
                function f_GEONW_PON_TSB_BV_07_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (value) GeoNetworkingInd v_msgInd;
                    var integer i;
                    var template (value) GeoNetworkingPdu v_gnPacket;
                    
                    // Preamble
                    f_prNeighbour();
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) -> value v_msgInd {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly rebroadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: TSB not rebroadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                    v_msgInd.msgIn.basicHeader.routerHopLimit := valueof(v_msgInd.msgIn.basicHeader.routerHopLimit) - 1;
filatov's avatar
filatov committed
                    v_gnPacket := v_msgInd.msgIn;
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_msgInd.msgIn));
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_TSB_BV_07_nodeD
                
            } // end GEONW_PON_TSB_BV_07
            
        } // end geoTopologicallyScopedBroadcast
        
        // 6.2.2.11
        group geoSingleHopBroadcast {
            
            group GEONW_PON_SHB_BV_01 {
                
                /**
                 * @desc  Test that the reception of a SHB indication over upper Gn SAP triggers the origination of a SHB
                 *        packet
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a SHB packet
                 *      }
                 *      then {
                 *          the IUT broadcasts the SHB packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/SHB/BV/01
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.10.2
                 */
                testcase TC_GEONW_PON_SHB_BV_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_SHB_BV_01_nodeB());
                    v_nodeD.start(f_GEONW_PON_SHB_BV_01_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_SHB_BV_01
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_SHB_BV_01)
                 */
                function f_GEONW_PON_SHB_BV_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if ( not f_utTriggerEvent(m_generateShbMessage) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwShbPacket(mw_longPosVectorPosition_withDelta(v_longPosVectorIut))
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: SHB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected SHB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_SHB_BV_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_SHB_BV_01)
                 */
                function f_GEONW_PON_SHB_BV_01_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwShbPacket(mw_longPosVectorPosition_withDelta(v_longPosVectorIut))
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: SHB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected SHB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_SHB_BV_01_nodeD
                
            } // end GEONW_PON_SHB_BV_01
            
            /**
             * @desc  Test that a received SHB packet is passed over the Gn SAP to the correct upper protocol if it is
             *        received for the first time
             * <pre>
             * Pics Selection: none
             * Config Id: CF02
             * Initial conditions:
             *  with {
             *    the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a SHB packet
             *      }
             *      then {
             *          the IUT passes the received SHB packet to the Upper Layer protocol
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/SHB/BV/02
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.10.3
             */
            testcase TC_GEONW_PON_SHB_BV_02() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB:= f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_gnPacket := m_geoNwPdu(m_geoNwShbPacket(v_longPosVectorNodeB));
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                
                f_sleep(PX_TAC);
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                    // empty on purpose 
                }
                if(i < lengthof(vc_utInds)) {
                    log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": FAIL: GN was not transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_SHB_BV_02
            
        } // end geoSingleHopBroadcast
        
        // 6.2.2.12
        group geoGeoAnycast {
            
            group GEONW_PON_GAC_BV_01 {
                
                /**
                 * @desc    Test that the reception of an anycast indication over upper Gn SAP triggers the origination of a
                 *          GeoAnycast packet's broadcasting if the IUT is within the Destination Area
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoAnycast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      }
                 *      then {
                 *          the IUT broadcasts the GeoAnycast packet
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see     ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/01
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.12.2
                 */
                testcase TC_GEONW_PON_GAC_BV_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_01_nodeB());
                    v_nodeD.start(f_GEONW_PON_GAC_BV_01_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GAC_BV_01
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_01)
                 */
                function f_GEONW_PON_GAC_BV_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if ( not f_utTriggerEvent(m_generateGeoAnycastMessage(f_getArea(c_area1))) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoAnycastArea(c_area1)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoAnycast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_01)
                 */
                function f_GEONW_PON_GAC_BV_01_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoAnycastArea(c_area1)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoAnycast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_01_nodeD
                
            } // end GEONW_PON_GAC_BV_01
            
            group GEONW_PON_GAC_BV_02 {
                
                /**
                 * @desc    Test that the reception of an anycast indication over upper Gn SAP triggers the origination of a
                 *          GeoAnycast packet's line forwarding if the IUT is outside the Destination Area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'GREEDY' OR
                 * 				   PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'UNSPECIFIED'
filatov's avatar
filatov committed
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT is requested to send a GeoAnycast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop and
                 *          the IUT sends the GeoAnycast packet (see note)
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *  }
                 *  NOTE: Next hop ITS Station being identified by the MAC layer address of ItsNodeB
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/02
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.12.2, Annex D.2
filatov's avatar
filatov committed
                 */
                testcase TC_GEONW_PON_GAC_BV_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if ((f_getGeoBroadcastForwardingAlgorithm() != e_simple) and (f_getGeoBroadcastForwardingAlgorithm() != e_unspecified)) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_simple or e_unspecified ) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                                        
filatov's avatar
filatov committed
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_02_nodeB());
                    v_nodeD.start(f_GEONW_PON_GAC_BV_02_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GAC_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_02)
                 */
                function f_GEONW_PON_GAC_BV_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if ( not f_utTriggerEvent(m_generateGeoAnycastMessage(f_getArea(c_area2))) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
                    }
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoAnycastArea(c_area2)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoAnycast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_02)
                 */
                function f_GEONW_PON_GAC_BV_02_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                ?,
                                f_getGeoAnycastArea(c_area2)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: received GeoAnycast message ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_02_nodeD
                
            } // end GEONW_PON_GAC_BV_02
            
            group GEONW_PON_GAC_BV_03 {
                
                /**
                 * @desc    Test that a received GeoAnycast packet is not triggering forwarding or re-broadcasting if the IUT
                 *          is within the Destination Area
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoAnycast packet
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      }
                 *      then {
                 *          IUT does not re-broadcast the received GeoAnycast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/03
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.12.3
                 */
                testcase TC_GEONW_PON_GAC_BV_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_03_nodeB());
                    v_nodeD.start(f_GEONW_PON_GAC_BV_03_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GAC_BV_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_03)
                 */
                function f_GEONW_PON_GAC_BV_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeB,
                                    vc_localSeqNumber,
                                    f_getGeoAnycastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoAnycastArea(c_area1)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message re-forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_03)
                 */
                function f_GEONW_PON_GAC_BV_03_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoAnycastArea(c_area1)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message re-forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();

                } // end f_GEONW_PON_GAC_BV_03_nodeD
                
            } // end GEONW_PON_GAC_BV_03
            
            group GEONW_PON_GAC_BV_04 {
                
                /**
                 * @desc    Test that a received GeoAnycast packet is triggering line forwarding if received out of its
                 *          destination area for the first time
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB
                 *      the IUT having received Beacon information from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoAnycast packet from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing GeoAnycast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop and
                 *          the IUT forwards the GeoAnycast packet (see note)
                 *      }
                 *  }
                 *  NOTE: Next hop ITS Station being identified by the MAC layer address of ItsNodeB
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/04
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.12.3, Annex E.2
                 */
                testcase TC_GEONW_PON_GAC_BV_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_04_nodeB());
                    v_nodeC.start(f_GEONW_PON_GAC_BV_04_nodeC());
                    v_nodeD.start(f_GEONW_PON_GAC_BV_04_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GAC_BV_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_04)
                 */
                function f_GEONW_PON_GAC_BV_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoAnycastArea(c_area2)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoAnycast message correctly forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GAC_BV_04)
                 */
                function f_GEONW_PON_GAC_BV_04_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoAnycastArea(c_area2)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_04_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_04)
                 */
                function f_GEONW_PON_GAC_BV_04_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoAnycastArea(c_area2)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message not forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_04_nodeD
                
            } // end GEONW_PON_GAC_BV_04
            
            group GEONW_PON_GAC_BV_05 {
                
                /**
                 * @desc    Test that a received GeoAnycast packet is not triggering line forwarding if received out of its
                 *          destination area for the second or more time
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB
                 *      the IUT having received Beacon information from ItsNodeD
                 *      the IUT having received a GeoAnycast packet from ItsNodeC
                 *          containing TrafficClass.SCF set to 1 
                 *          containing Basic Header
                 *              containing RHL field
                 *                  indicating value HL1 higher than 1
                 *          containing GAC Extended Header
                 *              containing SN field
                 *                  indicating value SN1 and
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      the IUT having forwarded the GeoAnycast packet
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoAnycast packet from other neighbour
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value lower than HL1
                 *              containing GAC Extended Header
                 *                  containing SN field
                 *                      indicating value SN1
                 *      }
                 *      then {
                 *          the IUT does not forward the received GeoAnycast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/05
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.12.3
                 */
                testcase TC_GEONW_PON_GAC_BV_05() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    var UInt16 v_sequenceNumber := f_getInitialSequenceNumber();
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_05_nodeB());
                    v_nodeC.start(f_GEONW_PON_GAC_BV_05_nodeC(v_sequenceNumber));
                    v_nodeD.start(f_GEONW_PON_GAC_BV_05_nodeD(v_sequenceNumber));
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GAC_BV_05
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_05)
                 */
                function f_GEONW_PON_GAC_BV_05_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var template (present) GeoNetworkingInd v_msgInd;
                    
                    // Preamble
                    f_prNeighbour();
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwAnycastPacketWithArea(
                                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                                            ?,
                                            f_getGeoAnycastArea(c_area2)
                                        )
                                    )
                                )
                            ) -> value v_msgInd {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: Pre-conditions: GeoAnycast message correctly forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Test Body
                    v_msgInd.msgIn.basicHeader.routerHopLimit := ?;
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(v_msgInd) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message re-forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not re-forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_05_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GAC_BV_05)
                 */
                function f_GEONW_PON_GAC_BV_05_nodeC(in UInt16 p_sequenceNumber) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeC,
                                    p_sequenceNumber,
                                    f_getGeoAnycastArea(c_area2)
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoAnycastArea(c_area2)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast re-forwarded! (not to area center!) ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_05_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_05)
                 */
                function f_GEONW_PON_GAC_BV_05_nodeD(in UInt16 p_sequenceNumber) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoAnycastArea(c_area2)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: GeoAnycast message not forwarded to area center ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: Pre-conditions: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Test Body
                    // send geoAnycast for second time (same source + same seq Nr + lower RHL)
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeC,
                                    p_sequenceNumber,
                                    f_getGeoAnycastArea(c_area2)
                                ),
                                -,
                                c_defaultHopLimit - 1
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoAnycastArea(c_area2)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast re-forwarded! (not to area center!) ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_05_nodeD
                
            } // end GEONW_PON_GAC_BV_05
            
            group GEONW_PON_GAC_BV_06 {
                
                /**
                 * @desc    Test that the protocol header fields (RHL) are correctly updated during a GeoAnycast 
                 *          forwarding step
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoAnycast packet from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value HL1 higher than 1
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating value MHL1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *      then {
                 *          the IUT selects the ItsNodeB as the next hop
                 *          the IUT forwards the GeoAnycast packet
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value (HL1 - 1)
                 *              containing Common Header
                 *                  containing MHL field
                 *                      indicating value MHL1
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA2
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/06
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.6.3 and 9.3.12.3
                 */
                testcase TC_GEONW_PON_GAC_BV_06() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_06_nodeB());
                    v_nodeC.start(f_GEONW_PON_GAC_BV_06_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GAC_BV_06
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_06)
                 */
                function f_GEONW_PON_GAC_BV_06_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoAnycastWithAreaWithHopLimit(
                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                            ?,
                            f_getGeoAnycastArea(c_area2),
                            c_defaultHopLimit - 1,
                            c_defaultHopLimit) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoAnycast message correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_06_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GAC_BV_06)
                 */
                function f_GEONW_PON_GAC_BV_06_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoNetworkingInd v_msgInd;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoAnycastArea(c_area2),
                                    c_defaultHopLimit
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_06_nodeC
                
            } // end GEONW_PON_GAC_BV_06
            
            group GEONW_PON_GAC_BV_07 {
                
                /**
                 * @desc    Test that the RHL restriction is correctly handled at a GeoAnycast forwarding step
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoAnycast packet from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating 1
                 *              containing GAC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA2
                 *      }
                 *      then {
                 *         the IUT does not forward the GeoAnycast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/07
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.12.3
                 */
                testcase TC_GEONW_PON_GAC_BV_07() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_07_nodeB());
                    v_nodeC.start(f_GEONW_PON_GAC_BV_07_nodeC());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_PON_GAC_BV_07
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_07)
                 */
                function f_GEONW_PON_GAC_BV_07_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                            ?,
                            f_getGeoAnycastArea(c_area2)) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message re-forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not re-forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_07_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GAC_BV_07)
                 */
                function f_GEONW_PON_GAC_BV_07_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoAnycastArea(c_area2)
                                ),
                                -,
                                c_hopLimit1
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_07_nodeC
                
            } // end GEONW_PON_GAC_BV_07
            
            /**
             * @desc    Test that a received GeoAnycast packet is passed over the Gn SAP to the correct upper 
             *          protocol if it is received for the first time within the GeoAnycast destination area
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a GeoAnycast packet from ItsNodeB
             *              containing TrafficClass.SCF set to 1 
             *              containing GeoBroadcast DestinationArea
             *                  indicating AREA1
             *      }
             *      then {
             *          the IUT passes the received GeoAnycast packet to the correct Upper Layer protocol
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/08
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.12.3
             */
            testcase TC_GEONW_PON_GAC_BV_08() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_gnPacket := m_geoNwPdu(m_geoNwAnycastPacket(
                                            v_longPosVectorNodeB,
                                            vc_localSeqNumber,
                                            f_getGeoAnycastArea(c_area1)
                                        )
                                    );
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                
                f_sleep(PX_TAC);
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                    // empty on purpose 
                }
                if(i < lengthof(vc_utInds)) {
                    log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": FAIL: GN was not transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                
                log("*** " & testcasename() & ": GeoAnycast packet passed to Upper Layer ***");
                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_GAC_BV_08
            
            group GEONW_PON_GAC_BV_09 {
                
                /**
                 * @desc    Test that a received GeoAnycast packet is not passed over the Gn SAP if it is received for 
                 *          the second or more time
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF02
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received a GeoAnycast packet from ItsNodeD
                 *          containing TrafficClass.SCF set to 1
                 *          containing Basic Header
                 *              containing RHL field
                 *                  indicating HL1
                 *          containing GAC Extended Header
                 *              containing SN field
                 *                  indicating value SN1 and
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1 and
                 *      the IUT having passed the received GeoAnycast packet to the correct Upper Layer protocol
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoAnycast packet from ItsNodeB
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating value lower than HL1
                 *              containing GAC Extended Header
                 *                  containing SN field
                 *                      indicating value SN1
                 *      }
                 *      then {
                 *          the IUT does not pass the received GeoAnycast packet to any Upper Layer protocol
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/09
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.12.3
                 */
                testcase TC_GEONW_PON_GAC_BV_09() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    var template (value) GeoNetworkingPdu v_gnPacket;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf02Up(c_compNodeB);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_09_nodeB());
                    v_nodeD.start(f_GEONW_PON_GAC_BV_09_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end TC_GEONW_PON_GAC_BV_09
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_09)
                 */
                function f_GEONW_PON_GAC_BV_09_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                    var template (value) GeoNetworkingPdu v_gnPacket;
                    var integer i;
                    
                    // Preamble
                    f_prNeighbour();
                    
                    f_sleep(PX_TAC);
                    for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                        // empty on purpose 
                    }
                    if(i < lengthof(vc_utInds)) {
                        log("*** " & testcasename() & ": PASS: GN was transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    }
                    else {
                        log("*** " & testcasename() & ": INCONC: GN was not transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_prDone, e_error);
filatov's avatar
filatov committed
                    }
                    
                    // Test Body
                    v_gnPacket := m_geoNwPdu(m_geoNwAnycastPacket(
                                                v_longPosVectorNodeD,
                                                vc_localSeqNumber,
                                                f_getGeoAnycastArea(c_area1)
                                            ),
                                            -,
                                            c_defaultHopLimit / 2
                                        );
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                    
                    f_sleep(PX_TAC);
                    for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                        // empty on purpose 
                    }
                    if(i < lengthof(vc_utInds)) {
                        log("*** " & testcasename() & ": FAIL: GN was transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                    else {
                        log("*** " & testcasename() & ": PASS: GN was NOT transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_09_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_09)
                 */
                function f_GEONW_PON_GAC_BV_09_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                    var template (value) GeoNetworkingPdu v_gnPacket;
                    var integer i;
                    
                    // Preamble
                    f_prNeighbour();
                    v_gnPacket := m_geoNwPdu(m_geoNwAnycastPacket(
                                                v_longPosVectorNodeD,
                                                vc_localSeqNumber,
                                                f_getGeoAnycastArea(c_area1)
                                            ),
                                            -,
                                            c_defaultHopLimit
                                        );
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                    
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_09_nodeD
                
            } // end GEONW_PON_GAC_BV_09
            
            /**
             * @desc    Test that a received GeoAnycast packet is not passed over the Gn SAP if it is received for the 
             *          first time outside the GeoAnycast destination area
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state"
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT receives a GeoAnycast packet from ItsNodeB
             *              containing TrafficClass.SCF set to 1 
             *              containing GeoBroadcast DestinationArea
             *                  indicating AREA2
             *      }
             *      then {
             *          the IUT does not pass the received GeoAnycast packet to any Upper Layer protocol
             *      }
             *  }
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/10
filatov's avatar
filatov committed
             * @reference   EN 302 636-4-1 [1], clauses 9.3.12.3
             */
            testcase TC_GEONW_PON_GAC_BV_10() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prNeighbour();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                v_gnPacket := m_geoNwPdu(m_geoNwAnycastPacket(
                                            v_longPosVectorNodeB,
                                            vc_localSeqNumber,
                                            f_getGeoAnycastArea(c_area2)
                                        )
                                    );
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));

                f_sleep(PX_TAC);
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_gnPacket.gnPacket.packet.payload.rawPayload); i:=i+1) {
                    // empty on purpose 
                }
                if(i < lengthof(vc_utInds)) {
                    log("*** " & testcasename() & ": FAIL: GN was transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                }
                else {
                    log("*** " & testcasename() & ": PASS: GN was NOT transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_PON_GAC_BV_10
            
            group GEONW_PON_GAC_BV_11 {
                
                /**
                 * @desc    Test that a received GeoAnycast packet is discarded when indicating a too big GeoArea
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB
                 *      the IUT having received Beacon information from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GAC packet from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing DestinationArea
                 *                  indicating a geoArea bigger than itsGnMaxGeoAreaSize
                 *      }
                 *      then {
                 *          the IUT does not forward the received GAC packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/11
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex B.3
                 */
                testcase TC_GEONW_PON_GAC_BV_11() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    var UInt16 v_distanceTooBig;
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf04Up();
                    v_distanceTooBig := float2int(1.1 * f_radiusFromCircularArea(f_getGnMaxAreaSize()*c_squareKm));
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_11_nodeB(v_distanceTooBig));
                    v_nodeC.start(f_GEONW_PON_GAC_BV_11_nodeC(v_distanceTooBig));
                    v_nodeD.start(f_GEONW_PON_GAC_BV_11_nodeD(v_distanceTooBig));
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_GAC_BV_11
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_11)
                 */
                function f_GEONW_PON_GAC_BV_11_nodeB(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_computePosition(f_getPosition(c_compNodeB), 1000, 0), 
                        p_distanceTooBig
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_geoArea2GeoAnycastArea(v_areaTooBig)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_11_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GAC_BV_11)
                 */
                function f_GEONW_PON_GAC_BV_11_nodeC(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_computePosition(f_getPosition(c_compNodeB), 1000, 0), 
                        p_distanceTooBig
                    );
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_geoArea2GeoAnycastArea(v_areaTooBig)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_11_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_11)
                 */
                function f_GEONW_PON_GAC_BV_11_nodeD(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_computePosition(f_getPosition(c_compNodeB), 1000, 0), 
                        p_distanceTooBig
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_geoArea2GeoAnycastArea(v_areaTooBig)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoAnycast message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_11_nodeD
                
            } // end GEONW_PON_GAC_BV_11
                 * @desc    Test that the reception of an anycast indication over upper Gn SAP triggers the origination of a 
                 * 			GeoAnycast packet immediate broadcast if the IUT is outside the Destination Area
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM == 'CBF' 
                 * Config Id: CF02
filatov's avatar
filatov committed
                 * Initial conditions:
                 *  with {
                 *  	the IUT being in the "initial state" and
                 *  	the IUT having received Beacon information from ItsNodeD and
                 *  	the IUT having received Beacon information from ItsNodeB
filatov's avatar
filatov committed
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *  	when {
                 *  		the IUT is requested to send a GeoAnycast packet
                 *  			containing TrafficClass.SCF set to 1
                 *  			containing GeoAnycast DestinationArea
                 *  				indicating AREA2
                 *  	}
                 *  	then {
                 *  		the IUT broadcasts the packet immediately
                 *  	}
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/GAC/BV/13
                 * @reference   EN 302 636-4-1 [1], clauses 9.3.12.2
                testcase TC_GEONW_PON_GAC_BV_13() runs on ItsMtc system ItsGeoNetworkingSystem {
filatov's avatar
filatov committed
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if(f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_cbf ) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                                        
filatov's avatar
filatov committed
                    // Test component configuration
filatov's avatar
filatov committed
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_13_nodeB());
                    v_nodeD.start(f_GEONW_PON_GAC_BV_13_nodeD());
filatov's avatar
filatov committed
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                } // end TC_GEONW_PON_GAC_BV_13
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_13)
                function f_GEONW_PON_GAC_BV_13_nodeB() runs on ItsGeoNetworking {
filatov's avatar
filatov committed
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
filatov's avatar
filatov committed
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    if(not f_utTriggerEvent(m_generateGeoAnycastMessage(f_getArea(c_area2)))) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                f_getGeoAnycastArea(c_area2)) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoAnycast message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_13_nodeB
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_13)
                function f_GEONW_PON_GAC_BV_13_nodeD() runs on ItsGeoNetworking {
filatov's avatar
filatov committed
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
filatov's avatar
filatov committed
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
                                mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                                f_getGeoAnycastArea(c_area2)) {
filatov's avatar
filatov committed
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: received GeoAnycast message ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoAnycast message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_13_nodeD
            } // end GEONW_PON_GAC_BV_13
filatov's avatar
filatov committed
            
        } // end geoGeoAnycast
        
        // 6.2.2.13
        group geoGeoBroadcastCbfAlgorithm {
            
            group GEONW_PON_BCA_BV_01 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is discarded if received twice or more
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD
                 *      the IUT having received a GBC packet from ItsNodeC
                 *          containing TrafficClass.SCF set to 1 
                 *          containing GBC Extended Header
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      the IUT having saved the packet into CBF buffer
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet from ItsNodeD
                 *      }
                 *      then {
                 *          the IUT removes the GeoBroadcast packet from the CBF buffer
                 *          the IUT discards the new received GeoBroadcast packet
                 *      }
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BCA/BV/01
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.3
                 */
                testcase TC_GEONW_PON_BCA_BV_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    var UInt16 v_sequenceNumberC := f_getInitialSequenceNumber();
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                                        
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_01_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_01_nodeC(v_sequenceNumberC));
                    v_nodeD.start(f_GEONW_PON_BCA_BV_01_nodeD(v_sequenceNumberC));
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BCA_BV_01
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_01)
                 */
                function f_GEONW_PON_BCA_BV_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_01)
                 */
                function f_GEONW_PON_BCA_BV_01_nodeC(in UInt16 p_sequenceNumberC) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    p_sequenceNumberC,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_01_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_01)
                 */
                function f_GEONW_PON_BCA_BV_01_nodeD(in UInt16 p_sequenceNumberC) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    p_sequenceNumberC,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_01_nodeD
                
            } // end GEONW_PON_BCA_BV_01
            
            group GEONW_PON_BCA_BV_02 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering contention if received for the first time from a known sender
filatov's avatar
filatov committed
                 *          when inside of the destination area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeC
filatov's avatar
filatov committed
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the a GeoBroadcast packet from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA1
                 *      }
                 *      then {
                 *          the IUT saves the GeoBroadcast packet into the CBF buffer and
                 *          the IUT starts the contention timer and
                 *          the IUT re-broadcasts the received GeoBroadcast packet
                 *              upon expiry of the contention timer
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BCA/BV/02
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.3
                 */
                testcase TC_GEONW_PON_BCA_BV_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_02_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_02_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_02_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BCA_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_02)
                 */
                function f_GEONW_PON_BCA_BV_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_02)
                 */
                function f_GEONW_PON_BCA_BV_02_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    timer t_toCbf := (int2float(f_getGeoBroadcastCbfMaxTime())
                        + (
                            int2float(f_getGeoBroadcastCbfMinTime() - f_getGeoBroadcastCbfMaxTime())
                            / int2float(f_getCbfMaxCommunicationRange())
                        ) * f_distance(v_longPosVectorNodeC, v_longPosVectorIut)) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    t_toCbf.start;                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;                           
                            
                            if(t_toCbf.running) {                               
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_02_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_02)
                 */
                function f_GEONW_PON_BCA_BV_02_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_02_nodeD
                
            } // end GEONW_PON_BCA_BV_02
            
            group GEONW_PON_BCA_BV_03 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet from outside of the destination area is triggering line 
                 *          forwarding if received for the first time when IUT is outside of the destination area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received Beacon information from ItsNodeC
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the a GeoBroadcast packet from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA2
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as next hop ITS station and
                 *          the IUT forwards the GeoBroadcast packet (see note)
                 *      }
                 *  }
                 *  
                 *  NOTE: Next hop ITS Statoin being identified by the MAC layer address of ItsNodeB
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BCA/BV/03
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.3
                 */
                testcase TC_GEONW_PON_BCA_BV_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                                        
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_03_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_03_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_03_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BCA_BV_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_03)
                 */
                function f_GEONW_PON_BCA_BV_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd_withLinkLayerDestination(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )),
                            f_getTsGnLocalAddress(c_compNodeB).mid
                            )) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_03)
                 */
                function f_GEONW_PON_BCA_BV_03_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message was broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: Message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_03_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_03)
                 */
                function f_GEONW_PON_BCA_BV_03_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message was broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: Message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_03_nodeD
                
            } // end GEONW_PON_BCA_BV_03
            
            group GEONW_PON_BCA_BV_04 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet from inside of the destination area is discarded if 
                 *          received for the first time when IUT is outside of the destination area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the a GeoBroadcast packet from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA2
                 *      }
                 *      then {
                 *          the IUT discards the received GeoBroadcast packet
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BCA/BV/04
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.3
                 */
                testcase TC_GEONW_PON_BCA_BV_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                                                          
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_04_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_04_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_04_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BCA_BV_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_04)
                 */
                function f_GEONW_PON_BCA_BV_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast received and not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_04)
                 */
                function f_GEONW_PON_BCA_BV_04_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast received and not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_04_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_04)
                 */
                function f_GEONW_PON_BCA_BV_04_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeD,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast received and not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_04_nodeD
                
            } // end GEONW_PON_BCA_BV_04
            
            group GEONW_PON_BCA_BV_05 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering contention if received for the first time 
                 *          when IUT is inside of the destination area from an unknown sender
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT not having received any message from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the a GeoBroadcast packet generated by ItsNodeC from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA1
                 *      }
                 *      then {
                 *          the IUT saves the GeoBroadcast packet into the CBF buffer and
                 *          the IUT starts the contention timer set to CBF_MAX and
                 *          the IUT broadcasts the received GeoBroedcast packet
                 *              upon expiry of the contention timer
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BCA/BV/05
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.3
                 */
                testcase TC_GEONW_PON_BCA_BV_05() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_05_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_05_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_05_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BCA_BV_05
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_05)
                 */
                function f_GEONW_PON_BCA_BV_05_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_05_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_05)
                 */
                function f_GEONW_PON_BCA_BV_05_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_05_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_05)
                 */
                function f_GEONW_PON_BCA_BV_05_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    timer t_toCbf := int2float(f_getGeoBroadcastCbfMaxTime()) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    t_toCbf.start;                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;                           
                            
                            if(t_toCbf.running) {                               
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_BCA_BV_05_nodeD
                
            } // end GEONW_PON_BCA_BV_05
            
            group GEONW_PON_BCA_BV_06 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet from outside of the destination area is triggering re-broadcast
                 * 		    if received for the first time when IUT is outside of the destination area from an 
filatov's avatar
filatov committed
                 *          unknown sender
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT not having received any message from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the a GeoBroadcast packet generated by ItsNodeC from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA2
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the GeoBroadcast packet immediately
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BCA/BV/06
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.3
                 */
                testcase TC_GEONW_PON_BCA_BV_06() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_06_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_06_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_06_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BCA_BV_06
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_06)
                 */
                function f_GEONW_PON_BCA_BV_06_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_06_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_06)
                 */
                function f_GEONW_PON_BCA_BV_06_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                    
filatov's avatar
filatov committed
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
filatov's avatar
filatov committed
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_06_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_06)
                 */
                function f_GEONW_PON_BCA_BV_06_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    
filatov's avatar
filatov committed
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
filatov's avatar
filatov committed
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_BCA_BV_06_nodeD
                
            } // end GEONW_PON_BCA_BV_06
            
            group GEONW_PON_BCA_BV_07 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is rebroadcasted if received for the first time
                 *          when IUT is outside of the destination area from a known sender having an uncertain position (PAI == 0).
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF04
                 * Initial conditions:
                 * with {
                 *    the IUT being in the "initial state" and
                 *    the IUT having received Beacon information from ItsNodeB and
                 *    the IUT having received Beacon information from ItsNodeD
                 *        containing Beacon ExtendedHeader
                 *            containing SOPV field
                 *                containing PAI
filatov's avatar
filatov committed
                 * }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the a GeoBroadcast packet generated by ItsNodeC from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA2
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the GeoBroadcast packet
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BCA/BV/07
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.3
                 */
                testcase TC_GEONW_PON_BCA_BV_07() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_07_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_07_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_07_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BCA_BV_07
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_07)
                 */
                function f_GEONW_PON_BCA_BV_07_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeA),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_07_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_07)
                 */
                function f_GEONW_PON_BCA_BV_07_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    v_longPosVectorNodeC.pai := int2bit(0,1);
                    f_changePositon(c_compNodeC, v_longPosVectorNodeC); 
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body 
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeA,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );                   
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeA),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_07_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_07)
                 */
                function f_GEONW_PON_BCA_BV_07_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeA),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_07_nodeD
                
            } // end GEONW_PON_BCA_BV_07

            group GEONW_PON_BCA_BV_08 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering contention if received for the first time 
                 *          when IUT is inside of the destination area from an unknown sender
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'CBF'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD
                 *        containing Beacon ExtendedHeader
                 *            containing SOPV field
                 *                containing PAI
filatov's avatar
filatov committed
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the a GeoBroadcast packet generated by ItsNodeC from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA1
                 *      }
                 *      then {
                 *          the IUT saves the GeoBroadcast packet into the CBF buffer and
                 *          the IUT starts the contention timer set to CBF_MAX and
                 *          the IUT re-broadcasts the received GeoBroedcast packet
                 *              upon expiry of the contention timer
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BCA/BV/08
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.3
                 */
                testcase TC_GEONW_PON_BCA_BV_08() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_08_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_08_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_08_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BCA_BV_08
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_08)
                 */
                function f_GEONW_PON_BCA_BV_08_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_08_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_08)
                 */
                function f_GEONW_PON_BCA_BV_08_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_08_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_08)
                 */
                function f_GEONW_PON_BCA_BV_08_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                    timer t_toCbf := int2float(f_getGeoBroadcastCbfMaxTime()) * 0.95 / 1000.0;
                    
                    // Preamble                    
                    v_longPosVectorNodeD.pai := int2bit(0,1);
                    f_changePositon(c_compNodeD, v_longPosVectorNodeD); 
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    t_toCbf.start;                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;                           
                            
                            if(t_toCbf.running) {                               
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poDefault();
                    
                } // end f_GEONW_PON_BCA_BV_08_nodeD
                
            } // end GEONW_PON_BCA_BV_08

        } // end geoGeoBroadcastCbfAlgorithm
        
        // 6.2.2.13
        group geoGeoBroadcastAdvAlgorithm {
            
            group GEONW_PON_BAA_BV_01 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is discarded if received more than MAX_COUNTER 
                 *          times when IUT is inside of the destination area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF06
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeF and
                 *      the IUT having received a GeoBroadcast packet GBC1 from ItsNodeF
                 *          containing TrafficClass.SCF set to 1
                 *          containing GBC Extended Header
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      the IUT having saved the packet into CBF buffer
                 *      the IUT having received MAX_COUNTER - 1 times the GBC1 packet
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet GBC1
                 *      }
                 *      then {
                 *          the IUT removes GBC1 from the CBF buffer
                 *          the IUT discards the new received GeoBroadcast packet
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/01
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeF;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf06Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeF := f_getComponent(c_compNodeF);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_01_nodeB());
                    v_nodeF.start(f_GEONW_PON_BAA_BV_01_nodeF());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf06Down();
                    
                } // end TC_GEONW_PON_BAA_BV_01
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_01)
                 */
                function f_GEONW_PON_BAA_BV_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeF (TC_GEONW_PON_BAA_BV_01)
                 */
                function f_GEONW_PON_BAA_BV_01_nodeF() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var integer i;
                    var template (value) GeoNetworkingPdu v_gnPacket;
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    v_gnPacket := m_geoNwPdu(m_geoNwBroadcastPacket(
                                            v_longPosVectorNodeB,
                                            vc_localSeqNumber,
                                            f_getGeoBroadcastArea(c_area1)
                                        )
                                    );
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    for(i:=1; i < f_getAdvancedGbcForwardingMaxCounter(); i:=i+1) {
                        f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                        f_sleepIgnoreDef(0.5);
                    }
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_01_nodeF
                
            } // end GEONW_PON_BAA_BV_01
            
            group GEONW_PON_BAA_BV_02 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is discarded if received more than 1 times when IUT 
                 *          is inside of the destination area and inside the sectorial area of the GeoBroadcast packet Sender
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF05
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeE and
                 *      the IUT having received a GeoBroadcast packet GBC1 from ItsNodeB
                 *          containing TrafficClass.SCF set to 1
                 *          containing GBC Extended Header
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      the IUT having saved the packet into CBF buffer
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet GBC1 from ItsNodeE
                 *          the IUT is inside the sectorial area of ItsNodeB
                 *      }
                 *      then {
                 *          the IUT removes GBC1 from the CBF buffer
                 *          the IUT discards the new received GeoBroadcast packet
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/02
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeE;
                                                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf05Up();
                    
                    // Preamble
                                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeE := f_getComponent(c_compNodeE);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_02_nodeB());
                    v_nodeE.start(f_GEONW_PON_BAA_BV_02_nodeE());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf05Down();
                    
                } // end TC_GEONW_PON_BAA_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_02)
                 */
                function f_GEONW_PON_BAA_BV_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(m_geoNwBroadcastPacket(
                                v_longPosVectorNodeB,
                                0,
                                f_getGeoBroadcastArea(c_area1)
                            )
                        )
                    ));
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeE (TC_GEONW_PON_BAA_BV_02)
                 */
                function f_GEONW_PON_BAA_BV_02_nodeE() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(m_geoNwBroadcastPacket(
                                v_longPosVectorNodeB,
                                0,
                                f_getGeoBroadcastArea(c_area1)
                            )
                        )
                    ));
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive (mw_geoNwInd(mw_geoNwPdu(?))){
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_02_nodeE
                
            } // end GEONW_PON_BAA_BV_02
            
            group GEONW_PON_BAA_BV_03 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering contention if received more than 1 times when the IUT
                 *          is inside of the destination area and outside the sectorial area of the GeoBroadcast packet Sender (Angle_FSR > Angle_TH)
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF06
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeF and
                 *      the IUT having received a GeoBroadcast packet GBC1 from ItsNodeB
                 *          containing TrafficClass.SCF set to 1
                 *          containing GBC Extended Header
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      the IUT having saved the packet into CBF buffer
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet GBC1 from ItsNodeF
                 *          the IUT is outside the sectorial area of ItsNodeB
                 *      }
                 *      then {
                 *          the IUT saves the GeoBroadcast packet GBC1 from ItsNodeF and
                 *          the IUT starts the contention timer and
                 *          the IUT re-broadcasts the received GeoBroadcast packet
                 *              upon expiry of the contention timer
filatov's avatar
filatov committed
                 *      }
                 *  }
                 *  
                 *  Note: In this configuration IUT is outside sectorial area of ItsNodeB to the angle FSR
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/03
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_03() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeF;
                        
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf06Up();
                    
                    // Preamble
                                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeF := f_getComponent(c_compNodeF);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_03_nodeB());
                    v_nodeF.start(f_GEONW_PON_BAA_BV_03_nodeF());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf06Down();
                    
                } // end TC_GEONW_PON_BAA_BV_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_03)
                 */
                function f_GEONW_PON_BAA_BV_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(m_geoNwBroadcastPacket(
                                v_longPosVectorNodeB,
                                0,
                                f_getGeoBroadcastArea(c_area1)
                            )
                        )
                    ));
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                 
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
	                        log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
	                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeF (TC_GEONW_PON_BAA_BV_03)
                 */
                function f_GEONW_PON_BAA_BV_03_nodeF() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var LongPosVector v_longPosVectorNodeF := f_getPosition(c_compNodeF);                    
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    timer t_toCbf := (int2float(f_getGeoBroadcastCbfMaxTime())
                        + (
                            int2float(f_getGeoBroadcastCbfMinTime() - f_getGeoBroadcastCbfMaxTime())
                            / int2float(f_getCbfMaxCommunicationRange())
                        ) * f_distance(v_longPosVectorNodeF, v_longPosVectorIut)) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(m_geoNwBroadcastPacket(
                                v_longPosVectorNodeB,
                                0,
                                f_getGeoBroadcastArea(c_area1)
                            )
                        )
                    ));
                    t_toCbf.start;                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;                           
                            
                            if(t_toCbf.running) {                            	
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_03_nodeF
                
            } // end GEONW_PON_BAA_BV_03
            
            group GEONW_PON_BAA_BV_04 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet with Unicast MAC destination is triggering line 
                 *          forwarding if received for the first time when IUT is inside the destination area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF05
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeE and
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet from ItsNodeE
                 *              addressed to IUT's link-layer address
                 *              containing TrafficClass.SCF set to 1 
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA1
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop ITS station and
                 *          the IUT forwards the GeoBroadcast packet
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/04
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_04() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeE;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf05Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeE := f_getComponent(c_compNodeE);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_04_nodeB());
                    v_nodeE.start(f_GEONW_PON_BAA_BV_04_nodeE());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf05Down();
                    
                } // end TC_GEONW_PON_BAA_BV_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_04)
                 */
                function f_GEONW_PON_BAA_BV_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {                    	
                    	[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeA),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: packet correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeE (TC_GEONW_PON_BAA_BV_04)
                 */
                function f_GEONW_PON_BAA_BV_04_nodeE() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
	                    m_geoNwReq_withLinkLayerDestination(
	                        m_geoNwPdu(m_geoNwBroadcastPacket(
	                                v_longPosVectorNodeA,
	                                0,
	                                f_getGeoBroadcastArea(c_area1)
	                            )
	                        ),
	                        f_getIutMacAddress()
	                    )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_04_nodeE
                
            } // end GEONW_PON_BAA_BV_04

            group GEONW_PON_BAA_BV_05 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet with Unicast MAC destination is triggering
                 * 			rebroadcast if received for the first time when IUT is inside the destination area.
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF05
                 * Initial conditions:
                 *  with {
                 *  	the IUT being in the "initial state" and
                 *  	the IUT having received Beacon information from ItsNodeB and
                 *  	the IUT having received Beacon information from ItsNodeE
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *  	when {
                 *  		the IUT receives a GeoBroadcast packet from ItsNodeE addressed to IUT’s link-layer address
                 *  			containing TrafficClass.SCF set to 1
                 *  			containing GBC Extended Header
                 *  				containing GeoBroadcast DestinationArea
                 *  					indicating AREA1
                 *  	}
                 *  	then {
                 *  		the IUT saves the GeoBroadcast packet into the CBF buffer and
                 *  		the IUT starts the contention timer set to CBF_MAX and
                 *  		the IUT re-broadcasts the received GeoBroadcast packet
                 *  			upon expiry of the contention timer
                 *  	}
                 *  }
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/05
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_05() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeE;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf05Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeE := f_getComponent(c_compNodeE);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_05_nodeB());
                    v_nodeE.start(f_GEONW_PON_BAA_BV_05_nodeE());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf05Down();
                    
                } // end TC_GEONW_PON_BAA_BV_05
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_05)
                 */
                function f_GEONW_PON_BAA_BV_05_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_ac.start;
                    alt {                    	
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeA),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: packet correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_05_nodeB
                
                /**
                 * @desc    Behavior function for NodeE (TC_GEONW_PON_BAA_BV_05)
                 */
                function f_GEONW_PON_BAA_BV_05_nodeE() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_withLinkLayerDestination(
                            m_geoNwPdu(m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeA,
                                    0,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            ),
                            f_getIutMacAddress()
                        )
                    );
                    tc_ac.start;
                    alt {                    	
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeA),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: packet correctly broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_05_nodeE
                
            } // end GEONW_PON_BAA_BV_05
                        
filatov's avatar
filatov committed
            group GEONW_PON_BAA_BV_06 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet with Broadcast destination is triggering contention if 
                 *          received for the first time from known sender when IUT is inside the destination area
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF05
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeE
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet from ItsNodeE
                 *              addressed to broadcast link-layer address
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA1
                 *      }
                 *      then {
                 *          the IUT calculates and starts the contention timer and
                 *          the IUT re-broadcasts the received GeoBroadcast packet
                 *              upon expiry of the contention timer
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/06
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_06() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeE;
                                        
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf05Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeE := f_getComponent(c_compNodeE);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_06_nodeB());
                    v_nodeE.start(f_GEONW_PON_BAA_BV_06_nodeE());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf05Down();
                    
                } // end TC_GEONW_PON_BAA_BV_06
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_06)
                 */
                function f_GEONW_PON_BAA_BV_06_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeE := f_getPosition(c_compNodeE);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    timer t_toCbf := (int2float(f_getGeoBroadcastCbfMaxTime())
                        + (
                            int2float(f_getGeoBroadcastCbfMinTime() - f_getGeoBroadcastCbfMaxTime())
                            / int2float(f_getCbfMaxCommunicationRange())
                        ) * f_distance(v_longPosVectorNodeE, v_longPosVectorIut)) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    t_toCbf.start;
                    tc_ac.start;
                    alt {                        
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeE),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            
                            if(t_toCbf.running) {
                                t_toCbf.stop;  
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");                              
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_06_nodeB
                
                /**
                 * @desc    Behavior function for NodeE (TC_GEONW_PON_BAA_BV_06)
                 */
                function f_GEONW_PON_BAA_BV_06_nodeE() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeE := f_getPosition(c_compNodeE);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    timer t_toCbf := (int2float(f_getGeoBroadcastCbfMaxTime())
                        + (
                            int2float(f_getGeoBroadcastCbfMinTime() - f_getGeoBroadcastCbfMaxTime())
                            / int2float(f_getCbfMaxCommunicationRange())
                        ) * f_distance(v_longPosVectorNodeE, v_longPosVectorIut)) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeE,
                                    0,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    t_toCbf.start;
                    tc_ac.start;
                    alt {                        
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeE),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            
                            if(t_toCbf.running) {
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_06_nodeE
                
            } // end GEONW_PON_BAA_BV_06
            
            group GEONW_PON_BAA_BV_07 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet from outside the destination area is triggering line 
                 *          forwarding if received for the first time from known sender when IUT is outside the destination area
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC and
                 *      the IUT having received Beacon information from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet from ItsNodeC
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA2
                 *      }
                 *      then {
                 *          the IUT selects ItsNodeB as the next hop ITS station and
                 *          the IUT forwards the GeoBroadcast packet
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/07
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_07() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                                                           
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_07_nodeB());
                    v_nodeC.start(f_GEONW_PON_BAA_BV_07_nodeC());
                    v_nodeD.start(f_GEONW_PON_BAA_BV_07_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BAA_BV_07
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_07)
                 */
                function f_GEONW_PON_BAA_BV_07_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {                       
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: packet correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_07_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BAA_BV_07)
                 */
                function f_GEONW_PON_BAA_BV_07_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    0,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_07_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BAA_BV_07)
                 */
                function f_GEONW_PON_BAA_BV_07_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_07_nodeD
                
            } // end GEONW_PON_BAA_BV_07
            
            group GEONW_PON_BAA_BV_08 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet with from inside the destination area is discarded if 
                 *          received for the first time from known sender when IUT is outside the destination area
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC and
                 *      the IUT having received Beacon information from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA2
                 *      }
                 *      then {
                 *          the IUT discards the received GeoBroadcast packet
                 *      }
                 *  }
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v2.1.1 TP/GEONW/PON/BAA/BV/08
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_08() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                                        
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_08_nodeB());
                    v_nodeC.start(f_GEONW_PON_BAA_BV_08_nodeC());
                    v_nodeD.start(f_GEONW_PON_BAA_BV_08_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BAA_BV_08
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_08)
                 */
                function f_GEONW_PON_BAA_BV_08_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_08_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BAA_BV_08)
                 */
                function f_GEONW_PON_BAA_BV_08_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: No message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_08_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BAA_BV_08)
                 */
                function f_GEONW_PON_BAA_BV_08_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeD,
                                    0,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_08_nodeD
                
            } // end GEONW_PON_BAA_BV_08
            
            group GEONW_PON_BAA_BV_09 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet with Broadcast MAC destination is triggering 
                 *          contention if received for the first time from an unknown sender when IUT is inside the 
                 *          destination area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF05
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT not having received any message from ItsNodeE
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet from ItsNodeE
                 *              addressed to link-layer broadcast address
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA1
                 *      }
                 *      then {
                 *          the IUT saves the GeoBroadcast packet into the CBF buffer and
                 *          the IUT starts the contention timer set to CBF_MAX and
                 *          the IUT re-broadcasts the received GeoBroadcast packet
                 *              upon expiry of the contention timer
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/09
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_09() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeE;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf05Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeE := f_getComponent(c_compNodeE);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_09_nodeB());
                    v_nodeE.start(f_GEONW_PON_BAA_BV_09_nodeE());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf05Down();
                    
                } // end TC_GEONW_PON_BAA_BV_09
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_09)
                 */
                function f_GEONW_PON_BAA_BV_09_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    timer t_toCbf := int2float(f_getGeoBroadcastCbfMaxTime()) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    t_toCbf.start;
                    tc_ac.start;
                    alt {                        
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            
                            if(t_toCbf.running) {
                            	t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_06_nodeB
                
                /**
                 * @desc    Behavior function for NodeE (TC_GEONW_PON_BAA_BV_09)
                 */
                function f_GEONW_PON_BAA_BV_09_nodeE() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    timer t_toCbf := int2float(f_getGeoBroadcastCbfMaxTime()) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeB,
                                    0,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    t_toCbf.start;
                    tc_ac.start;
                    alt {                        
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            
                            if(t_toCbf.running) {
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_09_nodeE
                
            } // end GEONW_PON_BAA_BV_09
            
            group GEONW_PON_BAA_BV_10 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering re-broadcast if received from unknown
                 *          sender for the first time when IUT is outside the destination area
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF04
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeC and
                 *      the IUT not having received any message from ItsNodeD
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet generated by ItsNodeC from ItsNodeD
                 *              containing TrafficClass.SCF set to 1
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast DestinationArea
                 *                      indicating AREA2
                 *      }
                 *      then {
                 *          the IUT re-broadcasts the GeoBroadcast packet immediately
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/10
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_10() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_10_nodeB());
                    v_nodeC.start(f_GEONW_PON_BAA_BV_10_nodeC());
                    v_nodeD.start(f_GEONW_PON_BAA_BV_10_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end TC_GEONW_PON_BAA_BV_10
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_10)
                 */
                function f_GEONW_PON_BAA_BV_10_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {                       
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: packet correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_10_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BAA_BV_10)
                 */
                function f_GEONW_PON_BAA_BV_10_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNonNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    0,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    tc_ac.start;
                    alt {                       
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: packet correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_10_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BAA_BV_10)
                 */
                function f_GEONW_PON_BAA_BV_10_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    tc_ac.start;
                    alt {                       
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: packet correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_10_nodeD
                
            } // end GEONW_PON_BAA_BV_10
            
            group GEONW_PON_BAA_BV_11 {
                
                /**
                 * @desc    Test that a received GeoBroadcast packet is triggering contention if received more than 1 times when IUT 
                 *          is inside the destination area and outside the sectorial area of the GeoBroadcast packet Sender (Dist_R > Dist_F)
filatov's avatar
filatov committed
                 * <pre>
                 * Pics Selection: PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == 'ADVANCED'
                 * Config Id: CF07
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having received Beacon information from ItsNodeB and
                 *      the IUT having received Beacon information from ItsNodeD and
                 *      the IUT having received a GeoBroadcast packet GBC1 from ItsNodeB
                 *          containing TrafficClass.SCF set to 1
                 *          containing GBC Extended Header
                 *              containing GeoBroadcast DestinationArea
                 *                  indicating AREA1
                 *      the IUT having saved packet into the CBF buffer
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives the same GeoBroadcast packet GBC1 from ItsNodeD
                 *          the IUT is outside the sectorial area of ItsNodeB
                 *      }
                 *      then {
                 *          the IUT saves the GeoBroadcast packet into the CBF buffer and
                 *          the IUT starts the contention timer and
                 *          the IUT re-broadcasts the received GeoBroadcast packet
                 *              upon expiry of the contention timer
filatov's avatar
filatov committed
                 *      }
                 *  }
                 * 
                 * Note: In this configuration IUT is outside sectorial area of ItsNodeB because of dist_R > dist_F 
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/PON/BAA/BV/11
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], Annex E.4
                 */
                testcase TC_GEONW_PON_BAA_BV_11() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                        
                    // Test control
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    if (f_getGeoBroadcastCbfMinTime() < 300) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf07Up();
                    
                    // Preamble
                                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BAA_BV_11_nodeB());
                    v_nodeD.start(f_GEONW_PON_BAA_BV_11_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf06Down();
                    
                } // end TC_GEONW_PON_BAA_BV_11
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BAA_BV_11)
                 */
                function f_GEONW_PON_BAA_BV_11_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(m_geoNwBroadcastPacket(
                                v_longPosVectorNodeB,
                                0,
                                f_getGeoBroadcastArea(c_area1)
                            )
                        )
                    ));
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body                  
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;                            
                            log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_11_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BAA_BV_11)
                 */
                function f_GEONW_PON_BAA_BV_11_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    timer t_toCbf := (int2float(f_getGeoBroadcastCbfMaxTime())
                        + (
                            int2float(f_getGeoBroadcastCbfMinTime() - f_getGeoBroadcastCbfMaxTime())
                            / int2float(f_getCbfMaxCommunicationRange())
                        ) * f_distance(v_longPosVectorNodeB, v_longPosVectorIut)) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(m_geoNwBroadcastPacket(
                                v_longPosVectorNodeB,
                                0,
                                f_getGeoBroadcastArea(c_area1)
                            )
                        )
                    ));
                    
                    t_toCbf.start;                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeB),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;                           
                            
                            if(t_toCbf.running) {
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GeoBroadcast message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GeoBroadcast message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BAA_BV_11_nodeD
                
            } // end GEONW_PON_BAA_BV_11
            
        } // end geoGeoBroadcastCbfAlgorithm
        
    } // end geoProtocolOperation
    
    // 6.2.3 Capacities
    group geoCapacities {
        
        // 6.2.3.1
        group geoCapLocationService {
            
            /**
             * @desc  Test of LS buffer capacity according to its GnLocationServicePacketBufferSize parameter and
             *        the overflow handling procedure
             * <pre>
             * Pics Selection: none
             * Config Id: CF01
             * Initial conditions:
             *  with {
             *      the IUT being in the "initial state" and
             *      the IUT having no Location Table Entry for ItsNodeA and
             *      the IUT having received Beacon information from ItsNodeB and
             *      the IUT having been requested to send multiple GeoUnicast packets to ItsNodeA
             *          containing TrafficClass.SCF set to 1 and
             *      the IUT having sent a LS_REQUEST packet and
             *      the IUT not having received a LS_REPLY packet
             *  }
             * Expected behaviour:
             *  ensure that {
             *      when {
             *          the IUT is requested to send a GeoUnicast packet to ItsNodeA
             *              containing TrafficClass.SCF set to 1 and
             *          the location service buffer capacity exceeded (see note 1)
             *      }
             *      then {
             *          the IUT removes the older packet(s) in the location service buffer and,
             *          the IUT inserts the new received packet at the end of the location service buffer (see note 2)
             *      }
             *  }
             *  NOTE 1: The amount of stored data exceeds Location Service buffer capacity defined by the 
             *          itsGnLocationServicePacketBufferSize MIB parameter
             *  NOTE 2: Buffered packets will be delivered upon reception of LS_REPLY message
             *  
             * </pre>
             *
             * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/CAP/LOS/BV/01
             * @reference   EN 302 636-4-1 [1], clauses 7.4.3
filatov's avatar
filatov committed
             */
            testcase TC_GEONW_CAP_LOS_BV_01() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeA;
                var LongPosVector v_longPosVectorNodeB;
                var LongPosVector v_longPosVectorIut;
                var GeoNetworkingInd v_msg;
                var integer v_packetSize := 0;
                var integer v_index := 0;
                var integer v_nbrOfPackets := 0;
                
                // Test control
                
                // Test component configuration
                f_cf01Up();
                
                // Test adapter configuration
                
                // Preamble
                v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                v_longPosVectorIut := f_getPosition(c_compIut);
                f_prNeighbour();
                
                // Trigger message to NodeB in order to get an estimation of packet size
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithPayload(v_longPosVectorNodeB.gnAddr, char2oct("PAYLOAD_" & oct2str(int2oct(0, 2))))) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeB)),
                                        ?
                                    )
                                )
                            )
                        ) -> value v_msg {
                        var GeoNetworkingReq v_req;
                        tc_ac.stop;
                        //if we use directly v_msg(GeoNetworkingInd) for encvalue the encoder must also be able to provide
                        //encoding of "incoming messages"...
                        v_req.msgOut := v_msg.msgIn;
                        v_packetSize := lengthof(bit2oct(encvalue(v_req.msgOut)));
                    }
                }
                
                // implicitely trigger LS_REQUEST
                if ( not f_utTriggerEvent(m_generateGeoUnicastMessage(v_longPosVectorNodeA.gnAddr)) ) {
                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                    f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
filatov's avatar
filatov committed
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(
                        ?,
                        v_longPosVectorNodeA.gnAddr.mid,
                        v_longPosVectorIut
                    ) {
                    }
                }
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                
                // Test Body
                // Fill the LS buffer + one more message to remove an older message
                v_nbrOfPackets := f_getLsPacketBufferSize() / v_packetSize + 1;
                log("*** " & testcasename() & ": " & int2str(v_nbrOfPackets) & " ***");
                for (v_index:=1; v_index <= v_nbrOfPackets; v_index:=v_index+1) {
	                if ( not f_utTriggerEvent(m_generateGeoUnicastMessageWithPayload(v_longPosVectorNodeA.gnAddr, char2oct("PAYLOAD_" & oct2str(int2oct(v_index, 2))))) ) {
	                    log("*** " & testcasename() & ": INCONC: Trigger failed ***");
	                    f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
filatov's avatar
filatov committed
	                }
                }
                
                f_sleepIgnoreDef(0.5);
                f_sendGeoNetMessage(
                    m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(
                            m_geoNwLsReplyPacket(
                                v_longPosVectorNodeB,
                                f_longPosVector2ShortPosVector(v_longPosVectorIut),
                                vc_localSeqNumber
                            )
                        )
                    )
                );
                
                // packet 1 shall be dropped
                v_index := 2;
                tc_ac.start;
                alt {
                    [] geoNetworkingPort.receive(
                        f_receiveGeoNetMessageWithPayload(
                            mw_geoNwInd(
                                mw_geoNwPdu(
                                    mw_geoNwUnicastPacket(
                                        mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                        ?
                                    )
                                )
                            ),
                            f_adaptPayload_mw(char2oct("PAYLOAD_" & oct2str(int2oct(v_index, 2))))
                        )
                    ) {
                        if (v_index < v_nbrOfPackets) {
                            v_index := v_index + 1;
                            repeat;
                        }
                        tc_ac.stop;
                        log("*** " & testcasename() & ": Older message was removed, new message was inserted ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Expected amount of messages were not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end TC_GEONW_CAP_LOS_BV_01
            
        } // end geoCapLocationService
        
        // 6.2.3.2
        group geoCapForwardingPacketBuffer {
            
            group GEONW_CAP_FPB_BV_01 {
                
                /**
                 * @desc    Test of UC forwarding buffer capacity according to itsGnUcForwardingPacketBufferSize 
                 *          parameter and the overflow handling procedure
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having no Location Table Entry for ItsNodeB and
                 *      the IUT having received multiple GeoUnicast packets addressed to ItsNodeA from ItsNodeC
                 *          containing TrafficClass.SCF set to 1
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoUnicast packet addressed to ItsNodeA from ItsNodeC
                 *              containing TrafficClass.SCF set to 1 
                 *              containing Basic Header
                 *                  containing RHL field
                 *                      indicating HL1 higher than 1
                 *          the UC forwarding packet buffer capacity exceeded (see note 1)
                 *      }
                 *      then {
                 *          the IUT removes the older packet(s) in the UC forwarding packet buffer and,
                 *          the IUT inserts the new received GeoUnicast packet at the end of the UC forwarding packet buffer (see note 2)
                 *      }
                 *  }
                 *  NOTE 1: The amount of stored data exceeds UC forwarding packet capacity defined by the
                 *          itsGnUcForwardingPacketBufferSize MIB parameter
                 *  NOTE 2: Buffered packets will be delivered upon reception of Beacon message from ItsNodeB
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/CAP/FPB/BV/01
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3
                 */
                testcase TC_GEONW_CAP_FPB_BV_01() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var template (value) GeoNetworkingPdu v_geoNetworkingMsg;
                    var integer v_packetSize := 0;
                    var integer v_nbrOfPackets := 0;
                    var integer v_payloadSize := f_min(1400, f_getUcForwardingPacketBufferSize() / 10 );
                    var octetstring v_payload;
                    const integer c_nbrOfDiscardedMessages := 1;
                    var UInt16 v_sequenceNumberC := f_getInitialSequenceNumber();
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Prepare GeoUnicast message
                    v_payload := int2oct(0, v_payloadSize);
                    v_geoNetworkingMsg := m_geoNwPdu(
                        m_geoNwUnicastPacket(
                            m_dummyLongPosVector,
                            f_longPosVector2ShortPosVector(valueof(m_dummyLongPosVector)),
                            0)
                    );
                    v_geoNetworkingMsg.gnPacket.packet.payload := f_adaptPayload_m(v_payload);
                    v_packetSize := lengthof(bit2oct(encvalue(v_geoNetworkingMsg)));
                    
                    // Fill the UC forwarding buffer + c_nbrOfDiscardedMessages more message to remove older messages
                    v_nbrOfPackets := f_getUcForwardingPacketBufferSize() / v_packetSize + c_nbrOfDiscardedMessages + 1;
                    log("*** " & testcasename() & ": " & int2str(v_nbrOfPackets) & " ***");
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_CAP_FPB_BV_01_nodeB(v_sequenceNumberC, v_nbrOfPackets, c_nbrOfDiscardedMessages));
                    v_nodeC.start(f_GEONW_CAP_FPB_BV_01_nodeC(v_sequenceNumberC, v_nbrOfPackets, v_geoNetworkingMsg));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_CAP_FPB_BV_01
                
filatov's avatar
filatov committed
                 * @desc    Behavior function for NodeB (TC_GEONW_CAP_FPB_BV_01)
                 * @param   p_sequenceNumberC           Initial sequence number of NodeC
                 * @param   p_nbrOfPackets              Number of packets sent by other component
                 * @param   p_nbrOfDiscardedMessages    Number of packets that should be discarded
filatov's avatar
filatov committed
                 */
                function f_GEONW_CAP_FPB_BV_01_nodeB(
                    in UInt16 p_sequenceNumberC,
                    in integer p_nbrOfPackets,
                    in integer p_nbrOfDiscardedMessages
                ) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var UInt16 v_expectedSeqNumber := p_sequenceNumberC + p_nbrOfDiscardedMessages + 1;
                    var integer v_nbReceivedMessages := 0;
                    
                    // Preamble
                    f_prDefault(); // NodeB is not yet a neighbour
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_startBeingNeighbour();
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwUnicastPacket(
                                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                            v_expectedSeqNumber
                                        )
                                    )
                                )
                            ) {
                            v_nbReceivedMessages := v_nbReceivedMessages + 1;
                            v_expectedSeqNumber := v_expectedSeqNumber + 1;
                            repeat; // repeat in any case => IUT may send more messages !
                        }
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwUnicastPacket(
                                            mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(v_longPosVectorNodeA)),
                                            ?
                                        )
                                    )
                                )
                            ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: Unexpected message received (Bad sequence number) ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            if(v_nbReceivedMessages == (p_nbrOfPackets - p_nbrOfDiscardedMessages)) {
                                log("*** " & testcasename() & ": PASS: Older messages wer removed, new messages were inserted ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": FAIL: Expected amount of messages were not received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_CAP_FPB_BV_01_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_CAP_FPB_BV_01)
                 * @param   p_sequenceNumberC     Initial sequence number of NodeC
                 * @param   p_nbrOfPackets        Number of packets to be send
                 * @param   p_geoNetworkingMsg    Pdu to be sent (template)
                 */
                function f_GEONW_CAP_FPB_BV_01_nodeC(
                    in UInt16 p_sequenceNumberC,
                    in integer p_nbrOfPackets,
                    in template (value) GeoNetworkingPdu p_geoNetworkingMsg
                ) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var integer i := 0;
                    
                    // Preamble
                    f_prNeighbour();
                    vc_localSeqNumber := p_sequenceNumberC;
                    
                    p_geoNetworkingMsg.gnPacket.packet.extendedHeader.geoUnicastHeader.srcPosVector := v_longPosVectorNodeC;
                    p_geoNetworkingMsg.gnPacket.packet.extendedHeader.geoUnicastHeader.dstPosVector := f_longPosVector2ShortPosVector(v_longPosVectorNodeA);
                    for (i:=0; i < p_nbrOfPackets; i:=i+1) {
                        p_geoNetworkingMsg.gnPacket.packet.extendedHeader.geoUnicastHeader.seqNumber := vc_localSeqNumber;
                        f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(p_geoNetworkingMsg));
                    }
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_CAP_FPB_BV_01_nodeC
                
            } // end GEONW_CAP_FPB_BV_01
            
            group GEONW_CAP_FPB_BV_02 {
                
                /**
                 * @desc    Test of BC forwarding buffer capacity according to itsGnBcForwardingPacketBufferSize 
                 *          parameter and the overflow handling procedure
                 * <pre>
                 * Pics Selection: none
                 * Config Id: CF03
                 * Initial conditions:
                 *  with {
                 *      the IUT being in the "initial state" and
                 *      the IUT having no Location Table Entry for ItsNodeB
                 *      the IUT having received multiple GeoBroadcast packets
                 *          containing TrafficClass.SCF set to 1
                 *          containing GBC Extended Header
                 *              containing GeoBroadcast Destination Area
                 *                  indicating AREA2
                 *  }
                 * Expected behaviour:
                 *  ensure that {
                 *      when {
                 *          the IUT receives a GeoBroadcast packet
                 *              containing TrafficClass.SCF set to 1 
                 *              containing GBC Extended Header
                 *                  containing GeoBroadcast Destination Area
                 *                      indicating AREA2 and
                 *          the BC forwarding packet buffer capacity exceeded (see note 1)
                 *      }
                 *      then {
                 *          the IUT removes the older packet(s) in the BC forwarding packet buffer and,
                 *          the IUT inserts the new received GeoBroadcast packet at the end of the BC forwarding packet buffer (see note 2)
                 *      }
                 *  }
                 *  NOTE 1: The amount of stored data exceeds BC forwarding buffer capacity defined by the
                 *          itsGnBcForwardingPacketBufferSize MIB parameter
                 *  NOTE 2: Buffered packets will be delivered upon reception of Beacon message from ItsNodeB
                 *  
                 * </pre>
                 *
                 * @see         ETSI TS 102 871-2 v1.3.1 TP/GEONW/CAP/FPB/BV/02
filatov's avatar
filatov committed
                 * @reference   EN 302 636-4-1 [1], clauses 7.5.3
                 */
                testcase TC_GEONW_CAP_FPB_BV_02() runs on ItsMtc system ItsGeoNetworkingSystem {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var template (value) GeoNetworkingPdu v_geoNetworkingMsg;
                    var integer v_packetSize := 0;
                    var integer v_nbrOfPackets := 0;
                    const integer c_nbrOfDiscardedMessages := 1;
                    var UInt16 v_sequenceNumberC := f_getInitialSequenceNumber();
                    
                    // Test control
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Prepare GeoUnicast message
                    v_geoNetworkingMsg := m_geoNwPdu(m_geoNwBroadcastPacket(
                        m_dummyLongPosVector,
                        0,
                        m_dummyGeoBroadcastArea));
                    v_packetSize := lengthof(bit2oct(encvalue(v_geoNetworkingMsg)));
                    
                    // Fill the BC forwarding buffer + c_nbrOfDiscardedMessages more message to remove older messages
                    v_nbrOfPackets := f_getBcForwardingPacketBufferSize() / v_packetSize + c_nbrOfDiscardedMessages;
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeB.start(f_GEONW_CAP_FPB_BV_02_nodeB(v_sequenceNumberC, v_nbrOfPackets, c_nbrOfDiscardedMessages));
                    v_nodeC.start(f_GEONW_CAP_FPB_BV_02_nodeC(v_sequenceNumberC, v_nbrOfPackets, v_geoNetworkingMsg));
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf03Down();
                    
                } // end TC_GEONW_CAP_FPB_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_CAP_FPB_BV_02)
                 * @param   p_sequenceNumberC           Initial sequence number of NodeC
                 * @param   p_nbrOfPackets              Number of packets sent by other component
                 * @param   p_nbrOfDiscardedMessages    Number of packets that should be discarded
                 */
                function f_GEONW_CAP_FPB_BV_02_nodeB(
                    in UInt16 p_sequenceNumberC,
                    in integer p_nbrOfPackets,
                    in integer p_nbrOfDiscardedMessages
                ) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var UInt16 v_expectedSeqNumber := p_sequenceNumberC + p_nbrOfDiscardedMessages;
                    var integer v_nbReceivedMessages := 0;
                    
                    // Preamble
                    f_prDefault(); // NodeB is not yet a neighbour
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_startBeingNeighbour();
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcast(
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                            v_expectedSeqNumber
                        ) {
                            v_nbReceivedMessages := v_nbReceivedMessages + 1;
                            v_expectedSeqNumber := v_expectedSeqNumber + 1;
                            repeat; // repeat in any case => IUT may send more messages !
                        }
                        [] a_receiveGeoBroadcast(
                            mw_longPosVectorPosition_withDelta(v_longPosVectorIut),
                            ?
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: Unexpected message received (Bad sequence number) ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                        }
                        [] tc_ac.timeout {
                            if(v_nbReceivedMessages == (p_nbrOfPackets - p_nbrOfDiscardedMessages)) {
                                log("*** " & testcasename() & ": PASS: Older messages wer removed, new messages were inserted ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                            }
                            else {
                                log("*** " & testcasename() & ": FAIL: Expected amount of messages were not received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
filatov's avatar
filatov committed
                            }
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_CAP_FPB_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_CAP_FPB_BV_02)
                 * @param   p_sequenceNumberC     Initial sequence number of NodeC
                 * @param   p_nbrOfPackets        Number of packets to be send
                 * @param   p_geoNetworkingMsg    Pdu to be sent (template)
                 */
                function f_GEONW_CAP_FPB_BV_02_nodeC(
                    in UInt16 p_sequenceNumberC,
                    in integer p_nbrOfPackets,
                    in template (value) GeoNetworkingPdu p_geoNetworkingMsg
                ) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var integer i := 0;
                    
                    // Preamble
                    f_prNeighbour();
                    vc_localSeqNumber := p_sequenceNumberC;
                    
                    p_geoNetworkingMsg.gnPacket.packet := m_geoNwBroadcastPacket(
                        v_longPosVectorNodeC,
                        0,
                        f_getGeoBroadcastArea(c_area2)
                    );
                    for (i:=0; i < p_nbrOfPackets; i:=i+1) {
                        p_geoNetworkingMsg.gnPacket.packet.extendedHeader.geoBroadcastHeader.seqNumber := vc_localSeqNumber;
                        f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(p_geoNetworkingMsg));
                    }
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
filatov's avatar
filatov committed
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
filatov's avatar
filatov committed
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_CAP_FPB_BV_02_nodeC
                
            } // end GEONW_CAP_FPB_BV_02
            
        } // end geoCapForwardingPacketBuffer
        
    } // end geoCapacities
    
} // end ItsGeoNetworking_TestCases