ItsGeoNetworking_TpFunctions.ttcn 806 KB
Newer Older
berge's avatar
berge committed
										)
									)
								)
							);
                            
							t_toCbf.start;                    
							tc_ac.start;
							alt {
								[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
										mw_longPosVectorPosition(v_longPosVectorNodeC),
										?,
										f_getGeoAnycastArea(c_area2)
									)))) {
									tc_ac.stop;                           
                                    
									if(t_toCbf.running) {                               
										t_toCbf.stop;
										log("*** " & testcasename() & ": FAIL: GAC retransmitted before CBF timer expiration ***");
										f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
									}
									else {
										log("*** " & testcasename() & ": PASS: GAC message received ***");
										f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
									}
								}
								[] t_toCbf.timeout {
									log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
									repeat;
								}
								[] tc_ac.timeout {
									log("*** " & testcasename() & ": FAIL: GAC message not received ***");
									f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
								}
							}
                            
							// Postamble
							f_poDefault();
                            
						} // end f_GEONW_PON_GAC_NONAREA_CBF_BV_21_nodeD
                        
					} // end GEONW_PON_GAC_NONAREA_CBF_BV_21
berge's avatar
berge committed
					group GEONW_PON_GAC_NONAREA_CBF_BV_22 {
                        
						/**
						 * @desc    TP Function for TC_GEONW_PON_GAC_NONAREA_CBF_BV_22
						 */
						function f_GEONW_PON_GAC_NONAREA_CBF_BV_22() runs on ItsMtc {
                            
							// Local variables
							var ItsGeoNetworking v_nodeB;
							var ItsGeoNetworking v_nodeC;
							var ItsGeoNetworking v_nodeD;
                            
							// Test control
							if (not PICS_GN_GAC_FWD) {
								log("*** " & testcasename() & ": PICS_GN_GAC_FWD required for executing the TC ***");
								setverdict(inconc);
								stop;
							}
							if (f_getNonAreaForwardingAlgorithm() != e_cbf) {
								log("*** " & testcasename() & ": PICS_GN_NON_AREA_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
								setverdict(inconc);
								stop;
							}
                            
		//                    if (f_getCbfMinTime() < 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_GAC_NONAREA_CBF_BV_22_nodeB());
							v_nodeC.start(f_GEONW_PON_GAC_NONAREA_CBF_BV_22_nodeC());
							v_nodeD.start(f_GEONW_PON_GAC_NONAREA_CBF_BV_22_nodeD());
                            
							// Synchronization
							f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                            
							// Cleanup
							f_cf04Down();
                            
						} // end f_GEONW_PON_GAC_NONAREA_CBF_BV_22
                        
						/**
						 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_NONAREA_CBF_BV_22)
						 */
						function f_GEONW_PON_GAC_NONAREA_CBF_BV_22_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_geoNwAnycastPacketWithArea(
										mw_longPosVectorPosition(v_longPosVectorNodeA),
										?,
										f_getGeoAnycastArea(c_area2)
									)))) {
									tc_ac.stop;
									log("*** " & testcasename() & ": PASS: GAC broadcasted ***");
									f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
								}
								[] tc_ac.timeout {
									log("*** " & testcasename() & ": FAIL: GAC not broadcasted ***");
									f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
								}
							}
                            
							// Postamble
							f_poNeighbour();
                            
						} // end f_GEONW_PON_GAC_NONAREA_CBF_BV_22_nodeB
                        
						/**
						 * @desc    Behavior function for NodeC (TC_GEONW_PON_GAC_NONAREA_CBF_BV_22)
						 */
						function f_GEONW_PON_GAC_NONAREA_CBF_BV_22_nodeC() runs on ItsGeoNetworking {
                            
							// Local variables
							var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
							var LongPosVector v_longPosVectorNodeA := f_getPosition(c_compNodeA);
							timer t_toCbf := int2float(f_getCbfMaxTime()) * 0.95 / 1000.0;
                            
							// Preamble
							v_longPosVectorNodeC.pai := int2bit(0,1);
							f_changePositon(c_compNodeC, v_longPosVectorNodeC); 
							f_prNeighbour();
							f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                            
							// Test Body 
							f_sendGeoNetMessage(
								m_geoNwReq_linkLayerBroadcast(
									m_geoNwPdu(
										m_geoNwAnycastPacket(
											v_longPosVectorNodeA,
											vc_localSeqNumber,
											f_getGeoAnycastArea(c_area2)
										)
									)
								)
							);                   
                            
							t_toCbf.start;                    
							tc_ac.start;
							alt {
								[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
										mw_longPosVectorPosition(v_longPosVectorNodeA),
										?,
										f_getGeoAnycastArea(c_area2)
									)))) {
									tc_ac.stop;                           
        
									if(t_toCbf.running) {                               
										t_toCbf.stop;
										log("*** " & testcasename() & ": FAIL: GAC retransmitted before CBF timer expiration ***");
										f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
									}
									else {
										log("*** " & testcasename() & ": PASS: GAC message received ***");
										f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
									}
								}
								[] t_toCbf.timeout {
									log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
									repeat;
								}
								[] tc_ac.timeout {
									log("*** " & testcasename() & ": FAIL: GAC message not received ***");
									f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
								}
							}
                            
							// Postamble
							f_poNeighbour();
                            
						} // end f_GEONW_PON_GAC_NONAREA_CBF_BV_22_nodeC
                        
						/**
						 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_NONAREA_CBF_BV_22)
						 */
						function f_GEONW_PON_GAC_NONAREA_CBF_BV_22_nodeD() 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_geoNwAnycastPacketWithArea(
										mw_longPosVectorPosition(v_longPosVectorNodeA),
										?,
										f_getGeoAnycastArea(c_area2)
									)))) {
									tc_ac.stop;
									log("*** " & testcasename() & ": PASS: GAC broadcasted ***");
									f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
								}
								[] tc_ac.timeout {
									log("*** " & testcasename() & ": FAIL: GAC not broadcasted ***");
									f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
								}
							}
                            
							// Postamble
							f_poNeighbour();
                            
						} // end f_GEONW_PON_GAC_NONAREA_CBF_BV_22_nodeD
                        
					} // end GEONW_PON_GAC_NONAREA_CBF_BV_22
berge's avatar
berge committed
				} // end gacNonAreaContentionBasedForwarding
                            
			} // end gacNonAreaForwarding
        
			group gacAreaForwarding {
            
                group GEONW_PON_GAC_AREA_ALL_BV_01 {
berge's avatar
berge committed
                    /**
                     * @desc    TP Function for TC_GEONW_PON_GAC_AREA_ALL_BV_01
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_BV_01() runs on ItsMtc {
                        
                        // Local variables
                        var ItsGeoNetworking v_nodeB;
                        var ItsGeoNetworking v_nodeD;
                        
                        // Test control
                        if (not PICS_GN_GAC_SRC) {
                            log("*** " & testcasename() & ": PICS_GN_GAC_SRC 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_GAC_AREA_ALL_BV_01_nodeB());
                        v_nodeD.start(f_GEONW_PON_GAC_AREA_ALL_BV_01_nodeD());
                        
                        // Synchronization
                        f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                        
                        // Cleanup
                        f_cf02Down();
                        
                    } // end f_GEONW_PON_GAC_AREA_ALL_BV_01
                    
                    /**
                     * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_AREA_ALL_BV_01)
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_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);
                        
                        // Test Body
                        if ( not f_utTriggerEvent(m_generateGeoAnycastMessage(f_getArea(c_area1))) ) {
                            log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
berge's avatar
berge committed
                        
                        tc_ac.start;
                        alt {
                            [] a_receiveGeoAnycastWithArea(
                                    mw_longPosVectorPosition(v_longPosVectorIut),
                                    ?,
                                    f_getGeoAnycastArea(c_area1)) {
                                tc_ac.stop;
                                log("*** " & testcasename() & ": PASS: GAC message received correctly ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                            }
                            [] tc_ac.timeout {
                                log("*** " & testcasename() & ": FAIL: GAC message not received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                            }
berge's avatar
berge committed
                        
                        // Postamble
                        f_poNeighbour();
                        
                    } // end f_GEONW_PON_GAC_AREA_ALL_BV_01_nodeB
berge's avatar
berge committed
                    /**
                     * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_AREA_ALL_BV_01)
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_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);
                        
                        // Test Body
                        tc_ac.start;
                        alt {
                            [] a_receiveGeoAnycastWithArea(
                                    mw_longPosVectorPosition(v_longPosVectorIut),
                                    ?,
                                    f_getGeoAnycastArea(c_area1)) {
                                tc_ac.stop;
                                log("*** " & testcasename() & ": PASS: GAC message received correctly ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                            }
                            [] tc_ac.timeout {
                                log("*** " & testcasename() & ": FAIL: GAC message not received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                            }
                        }
                        
                        // Postamble
                        f_poNeighbour();
                        
                    } // end f_GEONW_PON_GAC_AREA_ALL_BV_01_nodeD
berge's avatar
berge committed
                } // end GEONW_PON_GAC_AREA_ALL_BV_01                
berge's avatar
berge committed
                group GEONW_PON_GAC_AREA_ALL_BV_02 {
berge's avatar
berge committed
                    /**
                     * @desc    TP Function for TC_GEONW_PON_GAC_AREA_ALL_BV_02
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_BV_02() runs on ItsMtc {
                        
                        // Local variables
                        var ItsGeoNetworking v_nodeB;
                        var ItsGeoNetworking v_nodeD;
                        
                        // Test control
                        if (not PICS_GN_GAC_FWD) {
                            log("*** " & testcasename() & ": PICS_GN_GAC_FWD 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_GAC_AREA_ALL_BV_02_nodeB());
                        v_nodeD.start(f_GEONW_PON_GAC_AREA_ALL_BV_02_nodeD());
                        
                        // Synchronization
                        f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                        
                        // Cleanup
                        f_cf02Down();
                        
                    } // end f_GEONW_PON_GAC_AREA_ALL_BV_02
berge's avatar
berge committed
                    /**
                     * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_AREA_ALL_BV_02)
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_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);
                        
                        // Test Body
                        f_sendGeoNetMessage(
                            m_geoNwReq_linkLayerBroadcast(
                                m_geoNwPdu(
                                    m_geoNwAnycastPacket(
                                        v_longPosVectorNodeB,
                                        vc_localSeqNumber,
                                        f_getGeoAnycastArea(c_area1)
                                    )
berge's avatar
berge committed
                        );
                        
                        tc_noac.start;
                        alt {
                            [] a_receiveGeoAnycastWithArea(
                                    mw_longPosVectorPosition(v_longPosVectorNodeB),
                                    ?,
                                    f_getGeoAnycastArea(c_area1)) {
                                tc_noac.stop;
                                log("*** " & testcasename() & ": FAIL: GAC message retransmitted ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                            }
                            [] tc_noac.timeout {
                                log("*** " & testcasename() & ": PASS: GAC message not retransmitted ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                            }
berge's avatar
berge committed
                        
                        // Postamble
                        f_poNeighbour();
                        
                    } // end f_GEONW_PON_GAC_AREA_ALL_BV_02_nodeB
berge's avatar
berge committed
                    /**
                     * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_AREA_ALL_BV_02)
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_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_noac.start;
                        alt {
                            [] a_receiveGeoAnycastWithArea(
                                    mw_longPosVectorPosition(v_longPosVectorNodeB),
                                    ?,
                                    f_getGeoAnycastArea(c_area1)) {
                                tc_noac.stop;
                                log("*** " & testcasename() & ": FAIL: GAC message retransmitted ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                            }
                            [] tc_noac.timeout {
                                log("*** " & testcasename() & ": PASS: GAC message not retransmitted ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                            }
berge's avatar
berge committed
                        
                        // Postamble
                        f_poNeighbour();
    
                    } // end f_GEONW_PON_GAC_AREA_ALL_BV_02_nodeD
berge's avatar
berge committed
                } // end GEONW_PON_GAC_AREA_ALL_BV_02
berge's avatar
berge committed
                 * @desc    TP Function for TC_GEONW_PON_GAC_AREA_ALL_BV_05
berge's avatar
berge committed
                function f_GEONW_PON_GAC_AREA_ALL_BV_05() runs on ItsGeoNetworking {
berge's avatar
berge committed
                    var LongPosVector v_longPosVectorNodeB;
                    var template (value) GeoNetworkingPdu v_gnPacket;
                    var integer i;
                    var GnRawPayload v_sentRawPayload;
                    
berge's avatar
berge committed
                    if (not PICS_GN_GAC_DST) {
                        log("*** " & testcasename() & ": PICS_GN_GAC_DST required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
berge's avatar
berge committed
                    f_cf01Up();
                    v_longPosVectorNodeB := f_getPosition(c_compNodeB);
berge's avatar
berge committed
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
berge's avatar
berge 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);
                    
                    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);
berge's avatar
berge committed
                    else {
                        log("*** " & testcasename() & ": FAIL: GN was not transmitted to upper layer ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    
                    log("*** " & testcasename() & ": GAC packet passed to Upper Layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
berge's avatar
berge committed
                    f_cf01Down();
berge's avatar
berge committed
                } // end f_GEONW_PON_GAC_AREA_ALL_BV_05
berge's avatar
berge committed
                group GEONW_PON_GAC_AREA_ALL_BO_08 {
berge's avatar
berge committed
                    /**
                     * @desc    TP Function for TC_GEONW_PON_GAC_AREA_ALL_BO_08
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_BO_08() runs on ItsMtc {
                        
                        // Local variables
                        var ItsGeoNetworking v_nodeB;
                        var ItsGeoNetworking v_nodeD;
                        var template (value) GeoNetworkingPdu v_gnPacket;
                        
                        // Test control
                        if (not PICS_GN_GAC_DST) {
                            log("*** " & testcasename() & ": PICS_GN_GAC_DST required for executing the TC ***");
                            setverdict(inconc);
                            stop;
                        }
                        
                        // 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_AREA_ALL_BO_08_nodeB());
                        v_nodeD.start(f_GEONW_PON_GAC_AREA_ALL_BO_08_nodeD());
                        
                        // Synchronization
                        f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                        
                        // Cleanup
                        f_cf02Down();
                        
                    } // end f_GEONW_PON_GAC_AREA_ALL_BO_08
berge's avatar
berge committed
                    /**
                     * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_AREA_ALL_BO_08)
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_BO_08_nodeB() runs on ItsGeoNetworking {
                        
                        // Local variables
                        var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                        var template (value) GeoNetworkingPdu v_gnPacket;
                        var integer i;
                        var GnRawPayload v_sentRawPayload;
                        
                        // Preamble
                        f_prNeighbour();
                        
                        f_sleep(PX_TAC);
                        
                        v_gnPacket := m_geoNwPdu(m_geoNwAnycastPacket(
                                                    v_longPosVectorNodeD,
                                                    vc_localSeqNumber,
                                                    f_getGeoAnycastArea(c_area1)
                                                ),
                                                -,
                                                c_defaultHopLimit
                                            );
                        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 ***");
                            vc_utInds := {};
                            f_selfOrClientSyncAndVerdict(c_prDone, e_success);
berge's avatar
berge committed
                        else {
                            log("*** " & testcasename() & ": INCONC: GN was not transmitted to upper layer ***");
                            f_selfOrClientSyncAndVerdict(c_prDone, e_error);
berge's avatar
berge committed
                        
                        // Test Body
                        v_gnPacket.basicHeader.routerHopLimit := valueof(v_gnPacket.basicHeader.routerHopLimit) / 2;
                        f_sendGeoNetMessage(m_geoNwReq_linkLayerBroadcast(v_gnPacket));
                        
                        f_sleep(PX_TAC);
                        
                        if(0 != lengthof(vc_utInds)) {
                            log("*** " & testcasename() & ": FAIL: GN was transmitted to upper layer ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
berge's avatar
berge committed
                        else {
                            log("*** " & testcasename() & ": PASS: GN was NOT transmitted to upper layer ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        
                        // Postamble
                        f_poNeighbour();
                        
                    } // end f_GEONW_PON_GAC_AREA_ALL_BO_08_nodeB
berge's avatar
berge committed
                    /**
                     * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_AREA_ALL_BO_08)
                     */
                    function f_GEONW_PON_GAC_AREA_ALL_BO_08_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);
                        
                        // Test Body
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        
                        // Postamble
                        f_poNeighbour();
                        
                    } // end f_GEONW_PON_GAC_AREA_ALL_BO_08_nodeD
berge's avatar
berge committed
                } // end GEONW_PON_GAC_AREA_ALL_BO_08
berge's avatar
berge committed
			} // end gacAreaForwarding
            
        } // end geoGeoAnycast
16661 16662 16663 16664 16665 16666 16667 16668 16669 16670 16671 16672 16673 16674 16675 16676 16677 16678 16679 16680 16681 16682 16683 16684 16685 16686 16687 16688 16689 16690 16691 16692 16693 16694 16695 16696 16697 16698 16699 16700 16701 16702 16703 16704 16705 16706 16707 16708 16709 16710 16711 16712 16713 16714 16715 16716 16717 16718 16719 16720 16721 16722 16723 16724 16725 16726 16727 16728 16729 16730 16731 16732 16733 16734 16735 16736 16737 16738 16739 16740 16741 16742 16743 16744 16745 16746 16747 16748 16749 16750 16751 16752 16753 16754 16755 16756 16757 16758 16759 16760 16761 16762 16763 16764 16765 16766 16767 16768 16769 16770 16771 16772 16773 16774 16775 16776 16777 16778 16779 16780 16781 16782 16783 16784 16785 16786 16787 16788 16789 16790 16791 16792 16793 16794 16795 16796 16797 16798 16799 16800 16801 16802 16803 16804 16805 16806 16807 16808 16809 16810 16811 16812 16813 16814 16815 16816 16817 16818 16819 16820 16821 16822 16823 16824 16825 16826 16827 16828 16829 16830 16831 16832 16833 16834 16835 16836 16837 16838 16839 16840 16841 16842 16843 16844 16845 16846 16847 16848 16849 16850 16851 16852 16853 16854 16855 16856 16857 16858 16859 16860 16861 16862 16863 16864 16865 16866 16867 16868 16869 16870 16871 16872 16873 16874 16875 16876 16877 16878 16879 16880 16881 16882 16883 16884 16885 16886 16887 16888 16889 16890 16891 16892 16893 16894 16895 16896 16897 16898 16899 16900 16901 16902 16903 16904 16905 16906 16907 16908 16909 16910 16911 16912 16913 16914 16915 16916 16917 16918 16919 16920 16921 16922 16923 16924 16925 16926 16927 16928 16929 16930 16931 16932 16933 16934 16935 16936 16937 16938 16939 16940 16941 16942 16943 16944 16945 16946 16947 16948 16949 16950 16951 16952 16953 16954 16955 16956 16957 16958 16959 16960 16961 16962 16963 16964 16965 16966 16967 16968 16969 16970 16971 16972 16973 16974 16975 16976 16977 16978 16979 16980 16981 16982 16983 16984 16985 16986 16987 16988 16989 16990 16991 16992 16993
        
    } // 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(
                    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);
                    }
                    [] 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 := 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 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(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 ***");