ItsGeoNetworking_TpFunctions.ttcn 721 KB
Newer Older
                        }
                        [] 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_09_nodeE
                
            } // end GEONW_PON_BAA_BV_09
            
            group GEONW_PON_BAA_BV_10 {
                
                /**
                 * @desc    TP Function for TC_GEONW_PON_BAA_BV_10
                 */
                function f_GEONW_PON_BAA_BV_10() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (not PICS_GN_GBC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GBC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
garciay's avatar
garciay committed
//                    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 f_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);
                    
                    // 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);
                        }
                        [] 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_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);
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        valueof(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);
                        }
                        [] 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_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);
                    
                    // 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);
                        }
                        [] 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_10_nodeD
                
            } // end GEONW_PON_BAA_BV_10
            
            group GEONW_PON_BAA_BV_11 {
                
                /**
                 * @desc    TP Function for TC_GEONW_PON_BAA_BV_11
                 */
                function f_GEONW_PON_BAA_BV_11() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                        
                    // Test control
                    if (not PICS_GN_GBC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GBC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_advanced) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_advanced required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
garciay's avatar
garciay committed
//                    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 f_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(valueof(m_geoNwReq_linkLayerBroadcast(
                        m_geoNwPdu(m_geoNwBroadcastPacket(
                                v_longPosVectorNodeB,
                                0,
                                f_getGeoBroadcastArea(c_area1)
                            )
                        )
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // 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: GBC message received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GBC message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // 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);
                    
                    // Test Body
                    f_sendGeoNetMessage(valueof(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);
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GBC message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GBC message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // 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    TP Function for TC_GEONW_CAP_LOS_BV_01
             */
            function f_GEONW_CAP_LOS_BV_01() runs on ItsGeoNetworking {
                
                // 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
                if (not PICS_GN_LS_REQ_SRC) {
                    log("*** " & testcasename() & ": PICS_GN_LS_REQ_SRC required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // 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);
                }
                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);
                }
                tc_ac.start;
                alt {
                    [] a_receiveLsRequest(
                        ?,
                        v_longPosVectorNodeA.gnAddr.mid,
                        v_longPosVectorIut
                    ) {
                    }
                }
                f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                
                // 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);
	                }
                }
                
                f_sleepIgnoreDef(0.5);
                f_sendGeoNetMessage(
                    valueof(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)),
                                        ?
                                    )
                                )
                            ),
                            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);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": Expected amount of messages were not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end f_GEONW_CAP_LOS_BV_01
            
        } // end geoCapLocationService
        
        // 6.2.3.2
        group geoCapForwardingPacketBuffer {
            
            group GEONW_CAP_FPB_BV_01 {
                
                /**
                 * @desc    TP Function for TC_GEONW_CAP_LOS_BV_01
                 */
                function f_GEONW_CAP_FPB_BV_01() runs on ItsMtc {
                    
                    // 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
                    if (not PICS_GN_GUC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GUC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                     
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    // Prepare GUC 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 := valueof(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 f_GEONW_CAP_FPB_BV_01
                
                /**
                 * @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
                 */
                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);
                    
                    // 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);
                        }
                        [] 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);
                            }
                            else {
                                log("*** " & testcasename() & ": FAIL: Expected amount of messages were not received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                            }
                        }
                    }
                    
                    // 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(valueof(m_geoNwReq_linkLayerBroadcast(p_geoNetworkingMsg)));
                    }
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_CAP_FPB_BV_01_nodeC
                
            } // end GEONW_CAP_FPB_BV_01
            
            group GEONW_CAP_FPB_BV_02 {
                
                /**
                 * @desc    TP Function for TC_GEONW_CAP_FPB_BV_02
                 */
                function f_GEONW_CAP_FPB_BV_02() runs on ItsMtc {
                    
                    // 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();
                    const octetstring c_defaultPayload := char2oct("DEFAULT_PAYLOAD");
                    const integer c_itsGnMaxSduSize := 1398;
                    var octetstring v_payload := c_defaultPayload;
                    
                    // Test control
                    if (not PICS_GN_GBC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GBC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf03Up();
                    
                    // Preamble
                    
                    v_geoNetworkingMsg := m_geoNwPdu(m_geoNwBroadcastPacket(
                        m_dummyLongPosVector,
                        0,
                        m_dummyGeoBroadcastArea));
                    
                    while (lengthof(v_payload) < (c_itsGnMaxSduSize- lengthof(c_defaultPayload))) {
                        v_payload := v_payload & c_defaultPayload;
                    }
                    
                    v_geoNetworkingMsg.gnPacket.packet.payload := valueof(v_payload);
                    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 f_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);
                    
                    // Test Body
                    f_startBeingNeighbour();
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoBroadcast(
garciay's avatar
garciay committed
                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                            v_expectedSeqNumber
                        ) {
                            v_nbReceivedMessages := v_nbReceivedMessages + 1;
                            v_expectedSeqNumber := v_expectedSeqNumber + 1;
                            repeat; // repeat in any case => IUT may send more messages !
                        }
                        [] a_receiveGeoBroadcast(
garciay's avatar
garciay committed
                            mw_longPosVectorPosition(v_longPosVectorNodeC),
                            ?
                        ) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": FAIL: Unexpected message received (Bad sequence number) ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] 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);
                            }
                            else {
                                log("*** " & testcasename() & ": FAIL: Expected amount of messages were not received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                            }
                        }
                    }
                    
                    // 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;
                    var GnRawPayload v_payload := valueof(p_geoNetworkingMsg.gnPacket.packet.payload); //save the given payload
                    
                    // Preamble
                    f_prNeighbour();
                    vc_localSeqNumber := p_sequenceNumberC;
                    
                    p_geoNetworkingMsg.gnPacket.packet := m_geoNwBroadcastPacket(
                        v_longPosVectorNodeC,
                        0,
                        f_getGeoBroadcastArea(c_area2)
                    );
                    p_geoNetworkingMsg.gnPacket.packet.payload := v_payload; //set back the original given payload
                    
                    for (i:=0; i < p_nbrOfPackets; i:=i+1) {
                        p_geoNetworkingMsg.gnPacket.packet.extendedHeader.geoBroadcastHeader.seqNumber := vc_localSeqNumber;
                        f_sendGeoNetMessage(valueof(m_geoNwReq_linkLayerBroadcast(p_geoNetworkingMsg)));
                    }
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_CAP_FPB_BV_02_nodeC
                
            } // end GEONW_CAP_FPB_BV_02
            
        } // end geoCapForwardingPacketBuffer
        
    } // end geoCapacities
    
} // end ItsGeoNetworking_TpFunctions