ItsGeoNetworking_TpFunctions.ttcn 806 KB
Newer Older
berge's avatar
berge committed
				} // end gbcAreaAdvancedForwarding
            
			} // end gbcAreaForwarding
            
        } // end geoGeoBroadcast
        
        // 6.2.2.10
        group geoTopologicallyScopedBroadcast {
berge's avatar
berge committed
            group GEONW_PON_TSB_BV_01 {
berge's avatar
berge committed
                 * @desc    TP Function for TC_GEONW_PON_TSB_BV_01
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BV_01() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
berge's avatar
berge committed
                    var ItsGeoNetworking v_nodeD;
                    
berge's avatar
berge committed
                    if (not PICS_GN_TSB_SRC) {
                        log("*** " & testcasename() & ": PICS_GN_TSB_SRC required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
berge's avatar
berge committed
                    f_cf02Up();
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
berge's avatar
berge committed
                    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
berge's avatar
berge committed
                    f_cf02Down();
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_01
berge's avatar
berge committed
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_01)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BV_01_nodeB() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
berge's avatar
berge committed
                    if ( not f_utTriggerEvent(m_generateTsbMessage) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                    tc_ac.start;
berge's avatar
berge committed
                        [] 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);
                        }
berge's avatar
berge committed
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_01_nodeB
berge's avatar
berge committed
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_01)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BV_01_nodeD() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
berge's avatar
berge committed
                    tc_ac.start;
berge's avatar
berge committed
                        [] 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);
                        }
berge's avatar
berge committed
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_01_nodeD
berge's avatar
berge committed
            } // end GEONW_PON_TSB_BV_01
berge's avatar
berge committed
            group GEONW_PON_TSB_BV_02 {
berge's avatar
berge committed
                 * @desc    TP Function for TC_GEONW_PON_TSB_BV_02
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BV_02() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
berge's avatar
berge committed
                    var ItsGeoNetworking v_nodeD;
                    
berge's avatar
berge committed
                    if (not PICS_GN_TSB_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_TSB_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
berge's avatar
berge committed
                    f_cf02Up();
berge's avatar
berge committed
                    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
berge's avatar
berge committed
                    f_cf02Down();
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_02
berge's avatar
berge committed
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_02)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BV_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
berge's avatar
berge committed
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwTsbPacket(
                                    vc_localSeqNumber,
                                    v_longPosVectorNodeB
                                ),
                                -,
                                c_defaultHopLimit
berge's avatar
berge committed
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
berge's avatar
berge committed
                            log("*** " & testcasename() & ": PASS: TSB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
berge's avatar
berge committed
                            log("*** " & testcasename() & ": FAIL: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_02_nodeB
berge's avatar
berge committed
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_02)
berge's avatar
berge committed
                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);
                    
                    // Test Body
                    tc_ac.start;
                    alt {
berge's avatar
berge committed
                        [] 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);
berge's avatar
berge committed
                            log("*** " & testcasename() & ": FAIL: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_02_nodeD
berge's avatar
berge committed
            } // end GEONW_PON_TSB_BV_02
berge's avatar
berge committed
            group GEONW_PON_TSB_BV_03 {
berge's avatar
berge committed
                 * @desc    TP Function for TC_GEONW_PON_TSB_BV_03
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BV_03() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
berge's avatar
berge committed
                    var ItsGeoNetworking v_nodeD;
berge's avatar
berge committed
                    if (not PICS_GN_TSB_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_TSB_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
berge's avatar
berge committed
                    f_cf02Up();
berge's avatar
berge committed
                    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
berge's avatar
berge committed
                    f_cf02Down();
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_03
berge's avatar
berge committed
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BV_03)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BV_03_nodeB() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
berge's avatar
berge committed
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwTsbPacket(
                                    vc_localSeqNumber,
                                    v_longPosVectorNodeB,
                                    c_defaultHopLimit
                                ),
                                -,
                                c_defaultHopLimit
                            )
                        )
                    );
                    
berge's avatar
berge committed
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        ),
                                        -,
                                        c_defaultHopLimit - 1
                                    )
                                )
                            ) {
berge's avatar
berge committed
                            log("*** " & testcasename() & ": PASS: TSB packet received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
berge's avatar
berge 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);
                        }
berge's avatar
berge committed
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                        }
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_03_nodeB
berge's avatar
berge committed
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BV_03)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BV_03_nodeD() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
berge's avatar
berge committed
                    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);
                        }
                        [] 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);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                        }
                    }
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BV_03_nodeD
berge's avatar
berge committed
            } // end GEONW_PON_TSB_BV_03
            
            group GEONW_PON_TSB_BO_04 {
berge's avatar
berge committed
                 * @desc    TP Function for TC_GEONW_PON_TSB_BO_04
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_04() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
berge's avatar
berge committed
                    var ItsGeoNetworking v_nodeD;
berge's avatar
berge committed
                    if (not PICS_GN_TSB_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_TSB_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
berge's avatar
berge committed
                    f_cf02Up();
berge's avatar
berge committed
                    v_nodeB := f_getComponent(c_compNodeB);                    
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_TSB_BO_04_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BO_04_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
berge's avatar
berge committed
                    f_cf02Down();
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_04
berge's avatar
berge committed
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BO_04)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_04_nodeB() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
berge's avatar
berge committed
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwTsbPacket(
                                    vc_localSeqNumber,
                                    v_longPosVectorNodeB
                                ),
                                -,
                                1
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_04_nodeB
berge's avatar
berge committed
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BO_04)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_04_nodeD() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
berge's avatar
berge committed
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
berge's avatar
berge committed
                            ) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: TSB message was re-broadcasted  ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
berge's avatar
berge committed
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: TSB message was not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_04_nodeD
berge's avatar
berge committed
            } // end GEONW_PON_TSB_BO_04
            
            /**
             * @desc    TP Function for TC_GEONW_PON_TSB_BV_05
             */
            function f_GEONW_PON_TSB_BV_05() runs on ItsGeoNetworking {
                
                // Local variables
                var LongPosVector v_longPosVectorNodeB;
                var template (value) GeoNetworkingPdu v_gnPacket;
                var integer i;
                var GnRawPayload v_sentRawPayload;
                
                // Test control
                if (not PICS_GN_TSB_DST) {
                    log("*** " & testcasename() & ": PICS_GN_TSB_DST required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cf01Up();
                v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                
                // Test adapter configuration
                
                // Preamble
                f_prDefault();
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                
                // Test Body
                v_gnPacket := m_geoNwPdu(m_geoNwTsbPacket(
                                            vc_localSeqNumber,
                                            v_longPosVectorNodeB
                                        )
                                    );
                f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                
                f_sleep(PX_TAC);
                
                v_sentRawPayload := f_adaptPayloadForUtInd_m(v_gnPacket.gnPacket.packet.payload);
                for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_sentRawPayload); 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);
                }
                
                log("*** " & testcasename() & ": TSB packet passed to Upper Layer  ***");
                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                
                // Postamble
                f_poDefault();
                f_cf01Down();
                
            } // end f_GEONW_PON_TSB_BV_05

            group GEONW_PON_TSB_BO_07 {
berge's avatar
berge committed
                 * @desc    TP Function for TC_GEONW_PON_TSB_BO_07 
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_07() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
berge's avatar
berge committed
                    var ItsGeoNetworking v_nodeD;
                    
berge's avatar
berge committed
                    if (not PICS_GN_TSB_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_TSB_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
berge's avatar
berge committed
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
berge's avatar
berge committed
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_TSB_BO_07_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BO_07_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
berge's avatar
berge committed
                    f_cf02Down();
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_07
berge's avatar
berge committed
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BO_07)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_07_nodeB() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (present) GeoNetworkingPdu v_gnPacket;
berge's avatar
berge committed
                    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);
berge's avatar
berge committed
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
berge's avatar
berge 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);
                        }
berge's avatar
berge committed
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: The same TSB packet was not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_07_nodeB
berge's avatar
berge committed
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BO_07)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_07_nodeD() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (value) GeoNetworkingInd v_msgInd;
                    
                    // Preamble
                    f_prNeighbour();
                    tc_ac.start;
berge's avatar
berge committed
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) -> value v_msgInd {
berge's avatar
berge committed
                            log("*** " & testcasename() & ": PASS: Pre-conditions: TSB packet received correctly  ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
berge's avatar
berge committed
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: Expected TSB message not received ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
                        }
                    }
                    
                    // Test Body
                    v_msgInd.msgIn.basicHeader.routerHopLimit := valueof(v_msgInd.msgIn.basicHeader.routerHopLimit) -1;
                    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);
                        }
berge's avatar
berge committed
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: The same TSB packet was not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_07_nodeD
berge's avatar
berge committed
            } // end GEONW_PON_TSB_BO_07
berge's avatar
berge committed
            group GEONW_PON_TSB_BO_08 {
berge's avatar
berge committed
                 * @desc    TP Function for TC_GEONW_PON_TSB_BV_08
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_08() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
berge's avatar
berge committed
                    if (not PICS_GN_TSB_DST) {
                        log("*** " & testcasename() & ": PICS_GN_TSB_DST required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
berge's avatar
berge committed
                    f_cf02Up(c_compNodeB);
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
berge's avatar
berge committed
                    v_nodeB.start(f_GEONW_PON_TSB_BO_08_nodeB());
                    v_nodeD.start(f_GEONW_PON_TSB_BO_08_nodeD());
berge's avatar
berge committed
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
berge's avatar
berge committed
                    f_cf02Down();
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_08
berge's avatar
berge committed
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_TSB_BO_08)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_08_nodeB() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (value) GeoNetworkingPdu v_gnPacket;
                    var integer i;
                    var GnRawPayload v_sentRawPayload;
berge's avatar
berge committed
                    v_gnPacket := m_geoNwPdu(m_geoNwTsbPacket(
                                                vc_localSeqNumber,
                                                v_longPosVectorNodeB
                                            ),
                                            -,
                                            c_defaultHopLimit
                                        );
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(valueof(v_gnPacket)));
berge's avatar
berge committed
                    alt {
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwTsbPacket(
                                            ?,
                                            mw_longPosVectorPosition(v_longPosVectorNodeB)
                                        )
                                    )
                                )
                            ) {
berge's avatar
berge committed
                            
                            f_sleep(PX_TAC);
                            
                            v_sentRawPayload := f_adaptPayloadForUtInd_m(v_gnPacket.gnPacket.packet.payload);
                            for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_sentRawPayload); i:=i+1) {
                                // empty on purpose 
                            }
                            if(i < lengthof(vc_utInds)) {
                                log("*** " & testcasename() & ": PASS: Pre-conditions: TSB correctly rebroadcasted and passed to Upper Layer ***");
                                vc_utInds := {};
                                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                            }
                            else {
                                log("*** " & testcasename() & ": INCONC: TSB was not transmitted to upper layer ***");
                                f_selfOrClientSyncAndVerdict(c_prDone, e_error);
                            }
berge's avatar
berge committed
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: TSB not rebroadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
berge's avatar
berge committed
                    f_sleep(PX_TAC);
                    
                    v_sentRawPayload := f_adaptPayloadForUtInd_m(v_gnPacket.gnPacket.packet.payload);
                    for(i:=0; i < lengthof(vc_utInds) and not match(vc_utInds[i].rawPayload, v_sentRawPayload); 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);
                    }
                    else {
                        log("*** " & testcasename() & ": PASS: Same TSB packet was not passed to Upper Layer  ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_08_nodeB
berge's avatar
berge committed
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_TSB_BO_08)
berge's avatar
berge committed
                function f_GEONW_PON_TSB_BO_08_nodeD() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB := f_getPosition(c_compNodeB);
                    var template (value) GeoNetworkingInd v_msgInd;
                    var integer i;
                    var template (value) GeoNetworkingPdu v_gnPacket;
berge's avatar
berge committed
                    tc_ac.start;
berge's avatar
berge committed
                        [] 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);
berge's avatar
berge committed
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": INCONC: Pre-conditions: TSB not rebroadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
berge's avatar
berge committed
                    // Test Body
                    v_msgInd.msgIn.basicHeader.routerHopLimit := valueof(v_msgInd.msgIn.basicHeader.routerHopLimit) - 1;
                    v_gnPacket := v_msgInd.msgIn;
                    f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_msgInd.msgIn));
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    
berge's avatar
berge committed
                } // end f_GEONW_PON_TSB_BO_08_nodeD
berge's avatar
berge committed
            } // end GEONW_PON_TSB_BO_08
            
        } // end geoTopologicallyScopedBroadcast
        
        // 6.2.2.11
        group geoSingleHopBroadcast {
berge's avatar
berge committed
            group GEONW_PON_SHB_BV_01 {
berge's avatar
berge committed
                 * @desc    TP Function for TC_GEONW_PON_SHB_BV_01
berge's avatar
berge committed
                function f_GEONW_PON_SHB_BV_01() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
berge's avatar
berge committed
                    
                    // Test control
                    if (not PICS_GN_SHB_SRC) {
                        log("*** " & testcasename() & ": PICS_GN_SHB_SRC required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
berge's avatar
berge committed
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
berge's avatar
berge committed
                    v_nodeB.start(f_GEONW_PON_SHB_BV_01_nodeB());
                    v_nodeD.start(f_GEONW_PON_SHB_BV_01_nodeD());
berge's avatar
berge committed
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
berge's avatar
berge committed
                    f_cf02Down();
berge's avatar
berge committed
                } // end f_GEONW_PON_SHB_BV_01
berge's avatar
berge committed
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_SHB_BV_01)
berge's avatar
berge committed
                function f_GEONW_PON_SHB_BV_01_nodeB() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
berge's avatar
berge committed
                    if ( not f_utTriggerEvent(m_generateShbMessage) ) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                    
                    tc_ac.start;
berge's avatar
berge committed
                        [] geoNetworkingPort.receive(
                                mw_geoNwInd(
                                    mw_geoNwPdu(
                                        mw_geoNwShbPacket(mw_longPosVectorPosition(v_longPosVectorIut))
                                    )
                                )
                            ) {
                            tc_ac.stop;