"...git@forge.etsi.org:nfv/api-tests.git" did not exist on "36f70db57229d750ede4d3383df2031680d6822d"
Newer
Older
* @author ETSI / STF405
* @version $URL$
* $Id$
* @desc Module containing functions for GeoNetworking
// Libcommon
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_VerdictControl {type FncRetCode;}
import from LibCommon_Sync all;
// LibIts
import from LibIts_TestSystem all;
import from LibIts_Interface all;
import from LibItsGeoNetworking_Pics all;
group geoConfigurationFunctions {
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - two ITS nodes (nodeA, nodeB)
* - Area1 which only includes NodeB and IUT
* - Area2 which only includes NodeB
* NodeB being close to the area center
*/
function f_cf01Up() runs on ItsNt {
// Variables
var PositionTable v_positionTable := {};
var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeDLongPosVector;
map(self:acPort, system:acPort);
map(self:utPort, system:utPort);
map(self:geoNetworkingPort, system:geoNetworkingPort);
// Connect
f_connect4SelfOrClientSync();
//Initialze the IUT
f_initialState();
//Get positions
v_iutLongPosVector := f_getIutLongPosVector();
v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
// Propagate GN addresses
v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
// Position table
f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
// Area table
f_addArea(v_areaTable, c_area1,
f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
f_addArea(v_areaTable, c_area2,
f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);
*/
function f_cf01Down() runs on ItsNt {
unmap(self:acPort, system:acPort);
unmap(self:utPort, system:utPort);
unmap(self:geoNetworkingPort, system:geoNetworkingPort);
// Disconnect
f_disconnect4SelfOrClientSync();
} // end f_cf01Down
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeB)
* - one ITS node (NodeD)
* - Area1 which only includes NodeB, NodeD and IUT
* - Area2 which only includes NodeB and NodeD
* NodeB being close to the area center
function f_cf02Up(out ItsNt p_nodeB, out ItsNt p_nodeD) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var LongPosVector v_iutLongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector;
// Create
p_nodeB := ItsNt.create(c_compNodeB) alive;
map(p_nodeB:acPort, system:acPort);
map(p_nodeD:acPort, system:acPort);
map(p_nodeB:utPort, system:utPort);
map(p_nodeD:utPort, system:utPort);
map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
// Connect
connect(p_nodeB:syncPort, self:syncPort);
//Initialze the IUT
f_initialState();
//Get positions
v_iutLongPosVector := f_getIutLongPosVector();
v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
// Propagate GN addresses
v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
v_nodeDLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeD);
f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
f_addPosition(v_positionTable, c_compNodeD, v_nodeDLongPosVector);
// Area table
f_addArea(v_areaTable, c_area1,
f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
f_addArea(v_areaTable, c_area2,
f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB));
p_nodeD.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeD));
function f_cf02Down(in ItsNt p_nodeB, in ItsNt p_nodeD) runs on ItsMtc {
unmap(p_nodeB:acPort, system:acPort);
unmap(p_nodeD:acPort, system:acPort);
unmap(p_nodeB:utPort, system:utPort);
unmap(p_nodeD:utPort, system:utPort);
unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
// Connect
disconnect(p_nodeB:syncPort, self:syncPort);
} // end f_cf02Down
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeA)
* - one ITS node in direction of NodeA (NodeB)
* - one ITS node not in direction of NodeA (NodeC)
* - Area1 which only includes NodeB and IUT
* - Area2 which only includes NodeB
* NodeB being close to the area center
function f_cf03Up(out ItsNt p_nodeB, out ItsNt p_nodeC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector;
// Create
p_nodeB := ItsNt.create(c_compNodeB) alive;
p_nodeC := ItsNt.create(c_compNodeC) alive;
// Map
map(p_nodeB:acPort, system:acPort);
map(p_nodeC:acPort, system:acPort);
map(p_nodeB:utPort, system:utPort);
map(p_nodeC:utPort, system:utPort);
map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
// Connect
connect(p_nodeB:syncPort, self:syncPort);
connect(p_nodeC:syncPort, self:syncPort);
//Initialze the IUT
f_initialState();
//Get positions
v_iutLongPosVector := f_getIutLongPosVector();
v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
// Propagate GN addresses
v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
f_addPosition(v_positionTable, c_compNodeC, v_nodeCLongPosVector);
// Area table
f_addArea(v_areaTable, c_area1,
f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
f_addArea(v_areaTable, c_area2,
f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB));
p_nodeC.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeC));
p_nodeB.done;
p_nodeC.done;
} // end f_cf03Up
/**
* @desc Deletes configuration cf03
* @param p_nodeA
* @param p_nodeB
* @param p_nodeC
*/
function f_cf03Down(in ItsNt p_nodeB, in ItsNt p_nodeC) runs on ItsMtc {
unmap(p_nodeB:acPort, system:acPort);
unmap(p_nodeC:acPort, system:acPort);
unmap(p_nodeB:utPort, system:utPort);
unmap(p_nodeC:utPort, system:utPort);
unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
// Connect
disconnect(p_nodeB:syncPort, self:syncPort);
disconnect(p_nodeC:syncPort, self:syncPort);
} // end f_cf03Down
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeA)
* - one ITS node in direction of NodeA and having
* shortest distance to NodeA (NodeB)
* - one ITS node in direction of NodeA (NodeD)
* - one ITS node not in direction of NodeA (NodeC)
* - Area1 which only includes NodeB, NodeD and IUT
* - Area2 which only includes NodeA, NodeB and NodeD
* NodeB being close to the area center
function f_cf04Up(out ItsNt p_nodeB, out ItsNt p_nodeC, out ItsNt p_nodeD) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector;
// Create
p_nodeB := ItsNt.create(c_compNodeB) alive;
p_nodeC := ItsNt.create(c_compNodeC) alive;
p_nodeD := ItsNt.create(c_compNodeD) alive;
// Map
map(p_nodeB:acPort, system:acPort);
map(p_nodeC:acPort, system:acPort);
map(p_nodeD:acPort, system:acPort);
map(p_nodeB:utPort, system:utPort);
map(p_nodeC:utPort, system:utPort);
map(p_nodeD:utPort, system:utPort);
map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
// Connect
connect(p_nodeB:syncPort, self:syncPort);
connect(p_nodeC:syncPort, self:syncPort);
connect(p_nodeD:syncPort, self:syncPort);
//Initialze the IUT
f_initialState();
//Get positions
v_iutLongPosVector := f_getIutLongPosVector();
v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
// Propagate GN addresses
v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
v_nodeDLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeD);
f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
f_addPosition(v_positionTable, c_compNodeC, v_nodeCLongPosVector);
f_addPosition(v_positionTable, c_compNodeD, v_nodeDLongPosVector);
// Area table
f_addArea(v_areaTable, c_area1,
f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
f_addArea(v_areaTable, c_area2,
f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB));
p_nodeC.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeC));
p_nodeD.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeD));
p_nodeB.done;
p_nodeC.done;
p_nodeD.done;
} // end f_cf04Up
/**
* @desc Deletes configuration cf04
* @param p_nodeB
* @param p_nodeC
* @param p_nodeD
*/
function f_cf04Down(in ItsNt p_nodeB, in ItsNt p_nodeC, in ItsNt p_nodeD) runs on ItsMtc {
unmap(p_nodeB:acPort, system:acPort);
unmap(p_nodeC:acPort, system:acPort);
unmap(p_nodeD:acPort, system:acPort);
unmap(p_nodeB:utPort, system:utPort);
unmap(p_nodeC:utPort, system:utPort);
unmap(p_nodeD:utPort, system:utPort);
unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
// Connect
disconnect(p_nodeB:syncPort, self:syncPort);
disconnect(p_nodeC:syncPort, self:syncPort);
disconnect(p_nodeD:syncPort, self:syncPort);
} // end f_cf04Down
function f_initialiseComponent(
in PositionTable p_positionTable,
in charstring p_componentName)
runs on ItsNt {
vc_positionTable := p_positionTable;
vc_componentName := p_componentName;
} // end f_initialiseComponent
vc_neighbourDefault := activate(a_neighbourDefault());
tepelmann
committed
f_acTriggerEvent(m_startBeaconing(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader));
} // end f_startBeingNeighbour
function f_stopBeingNeighbour() runs on ItsNt {
} // end geoConfigurationFunctions
group geoPositionFunctions {
function f_addPosition(
in LongPosVector p_positionValue
) {
key := p_positionKey,
position := p_positionValue
};
in charstring p_positionKey
) runs on ItsNt
return LongPosVector {
var LongPosVector v_return;
var integer i := 0;
for (i:=0; i<lengthof(vc_positionTable); i:=i+1) {
if (vc_positionTable[i].key == p_positionKey) {
v_return := vc_positionTable[i].position;
}
}
return v_return;
}
function f_computePosition(
in LongPosVector p_refPosition,
in integer p_longitudeFactor,
in integer p_latitudeFactor
) return LongPosVector {
var LongPosVector v_return := p_refPosition;
v_return.latitude := v_return.latitude + p_latitudeFactor * PX_DISTANCE_UNIT;
v_return.longitude := v_return.longitude + p_longitudeFactor * PX_DISTANCE_UNIT;
function f_addArea(
inout GeoAreaTable p_geoAreaTable,
in charstring p_areaKey,
in GeoArea p_geoArea
) {
p_geoAreaTable[lengthof(p_geoAreaTable)] := {
key := p_areaKey,
geoArea := p_geoArea
};
}
in charstring p_areaName
) runs on ItsNt
return GeoArea {
var GeoArea v_return;
var integer i := 0;
for (i:=0; i<lengthof(vc_areaTable); i:=i+1) {
if (vc_areaTable[i].key == p_areaName) {
v_return := vc_areaTable[i].geoArea;
function f_getGeoBroadcastArea(in charstring p_areaName) runs on ItsNt
return GeoBroadcastArea {
return f_geoArea2geoBroadcastArea(f_getArea(p_areaName));
function f_getGeoAnycastArea(in charstring p_areaName) runs on ItsNt
return GeoAnycastArea {
return f_geoArea2geoAnycastArea(f_getArea(p_areaName));
}
function f_geoArea2geoBroadcastArea(GeoArea p_area)
return GeoBroadcastArea {
var GeoBroadcastArea v_broadcastArea;
if (p_area.shape == e_geoCircle) {
v_broadcastArea.geoBroadcastSubType := e_geoBroadcastCircle;
}
else if (p_area.shape == e_geoRect) {
v_broadcastArea.geoBroadcastSubType := e_geoBroadcastRect;
}
else if (p_area.shape == e_geoElip) {
v_broadcastArea.geoBroadcastSubType := e_geoBroadcastElip;
}
else {
v_broadcastArea.geoBroadcastSubType := e_reserved;
}
v_broadcastArea.geoBroadcastArea := p_area.area;
return v_broadcastArea;
function f_geoArea2geoAnycastArea(GeoArea p_area)
return GeoAnycastArea {
var GeoAnycastArea v_anycastArea;
if (p_area.shape == e_geoCircle) {
v_anycastArea.geoAnycastSubType := e_geoAnycastCircle;
}
else if (p_area.shape == e_geoRect) {
v_anycastArea.geoAnycastSubType := e_geoAnycastRect;
}
else if (p_area.shape == e_geoElip) {
v_anycastArea.geoAnycastSubType := e_geoAnycastElip;
}
else {
v_anycastArea.geoAnycastSubType := e_reserved;
}
v_anycastArea.geoAnycastArea := p_area.area;
return v_anycastArea;
}
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
function f_computeSquareArea(
in LongPosVector p_centerLongPosVector,
in UInt16 p_distanceA
) return GeoArea {
var GeoArea v_geoArea;
v_geoArea := {
shape := e_geoRect,
area := {
geoAreaPosLatitude := p_centerLongPosVector.latitude,
geoAreaPosLongitude := p_centerLongPosVector.longitude,
distanceA := p_distanceA,
distanceB := p_distanceA,
angle := 0
}
}
return v_geoArea;
}
function f_distance(
in LongPosVector p_pointA,
in LongPosVector p_pointB
) return float {
return fx_computeDistance(p_pointA.latitude, p_pointA.longitude, p_pointB.latitude, p_pointB.longitude);
}
* @desc The base default.
*/
altstep a_default() runs on ItsNt {
var LongPosVector v_iutLongPosVector;
[] a_receiveLsRequest(
[] geoNetworkingPort.receive {
f_selfOrClientSyncAndVerdict("error", e_error, "*** a_default: Received an unexpected message ***");
f_selfOrClientSyncAndVerdict("error", e_timeout, "*** a_default: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
f_selfOrClientSyncAndVerdict("error", e_timeout, "*** a_default: Timeout while awaiting the reception of a message ***");
f_poDefault();
log("*** a_default: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
stop;
}
altstep a_neighbourDefault() runs on ItsNt {
[] a_receiveLsRequestAndReply(
?, f_getPosition(vc_componentName).gnAddr,
f_getPosition(vc_componentName),
f_poNeighbour();
log("*** a_neighbourDefault: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
stop;
}
[] a_default() {
}
}
group geoGeoUnicastAltsteps {
/**
* @desc Receive GeoUnicast packet
*/
altstep a_receiveGeoUnicast(
in template (present) LongPosVector p_senderLongPosVec,
in template (present) ShortPosVector p_destinationShortPosVec,
in template (present) UInt16 p_seqNumber
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoUnicastHeader(
p_senderLongPosVec,
p_destinationShortPosVec,
p_seqNumber)))) {
}
}
/**
* @desc Receive GeoUnicast packet for specific destination
*/
altstep a_receiveGeoUnicastWithDestination(in template (present) ShortPosVector p_destinationShortPosVec) runs on ItsNt {
[] a_receiveGeoUnicast(?, p_destinationShortPosVec, ?) {}
/**
* @desc Receive any GeoUnicast packet
*/
group geoGeoBroadcastAltsteps {
/**
* @desc Receive GeoBroadcast packet
*/
altstep a_receiveGeoBroadcast(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeader(
p_srcLongPosVec,
/**
* @desc Receive GeoBroadcast packet with specific Area and HopLimit
*/
altstep a_receiveGeoBroadcastWithAreaWithHopLimit(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber,
in template (present) GeoBroadcastArea p_broadcastArea,
in template (present) UInt8 p_hopLimit
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeaderWithAreaWithHopLimit(
p_srcLongPosVec,
p_senderLongPosVec,
p_seqNumber,
p_broadcastArea,
p_hopLimit
)))) {
}
}
/**
* @desc Receive GeoBroadcast packet for specific Geobroadcast Area
*/
altstep a_receiveGeoBroadcastWithArea(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) GeoBroadcastArea p_broadcastArea
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeaderWithArea(
p_srcLongPosVec,
p_seqNumber,
p_broadcastArea
)))) {
}
}
} // end geoGeoBroadcastAltsteps
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
group geoGeoAnycastAltsteps {
/**
* @desc Receive GeoAnycast packet
*/
altstep a_receiveGeoAnycast(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeader(
p_srcLongPosVec,
p_senderLongPosVec,
p_seqNumber
)))) {
}
}
/**
* @desc Receive GeoAnycast packet with specific Area and HopLimit
*/
altstep a_receiveGeoAnycastWithAreaWithHopLimit(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber,
in template (present) GeoAnycastArea p_anycastArea,
in template (present) UInt8 p_hopLimit
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeaderWithAreaWithHopLimit(
p_srcLongPosVec,
p_senderLongPosVec,
p_seqNumber,
p_anycastArea,
p_hopLimit
)))) {
}
}
/**
* @desc Receive GeoAnycast packet for specific GeoAnycast Area
*/
altstep a_receiveGeoAnycastWithArea(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber,
in template (present) GeoAnycastArea p_anycastArea
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeaderWithArea(
p_srcLongPosVec,
p_senderLongPosVec,
p_seqNumber,
p_anycastArea
)))) {
}
}
} // end geoGeoAnycastAltsteps
group geoLocationServiceAltsteps {
/**
* @desc Receive Location Service Request
*/
altstep a_receiveLsRequest(
in template (present) UInt16 p_seqNumber,
in template (present) GN_Address p_gnAddress,
var GeoNetworkingInd v_msg;
[] geoNetworkingPort.receive(
mw_geoNwInd(
mw_geoNwPdu(
mw_lsRequestHeader(
p_seqNumber,
p_gnAddress
)
)
)
) -> value v_msg {
p_reqSrcPosVector := valueof(v_msg.msgIn.header.lsRequestHeader.srcPosVector);
}
/**
* @desc Receive any Location Service Request
*/
altstep a_receiveAnyLsRequest() runs on ItsNt {
var LongPosVector v_reqSrcPosVector;
[] a_receiveLsRequest(?, ?, v_reqSrcPosVector) {}
}
/**
* @desc Receive Location Service Request and send Location Service Reply
*/
altstep a_receiveLsRequestAndReply(
in template (present) UInt16 p_reqSeqNumber,
in template (value) GN_Address p_gnAddress,
in template (value) LongPosVector p_repSrcPosVector,
in template (value) LongPosVector p_repSenderPosVector
var LongPosVector v_repDstPosVector;
[] a_receiveLsRequest(p_reqSeqNumber, p_gnAddress, v_repDstPosVector) {
f_sendGeoNetMessage(m_geoNwReq(m_geoNwPdu(
f_longPosVector2ShortPosVector(v_repDstPosVector),
}
}
} // end geoLocationServiceAltsteps
} // end geoAltsteps
group preambles {
/**
* @desc The default preamble.
*/
function f_prDefault() runs on ItsNt {
activate(a_default());
}
function f_prNonNeighbour() runs on ItsNt {
f_prDefault();
}
function f_prNeighbour() runs on ItsNt {
/**
* @desc Brings the IUT into an initial state.
* @return
*/
function f_initialState() {
initComponent.start(f_utInitializeIut(m_gnInitialize));
function f_handleLocationService(
in template (present) UInt16 p_reqSeqNumber,
in template (value) GN_Address p_gnAddress,
in template (value) LongPosVector p_repSrcPosVector,
in template (value) LongPosVector p_repSenderPosVector
) runs on ItsNt {
tc_ac.start;
alt {
[] a_receiveLsRequestAndReply(p_reqSeqNumber, p_gnAddress, p_repSrcPosVector, p_repSenderPosVector) {
tc_ac.stop;
}
}
}
function f_processLocationService(
in template (value) LongPosVector p_reqSrcPosVector,
in template (value) UInt16 p_reqSeqNumber,
in template (value) GN_Address p_gnAddress,
) runs on ItsNt return FncRetCode {
var FncRetCode v_ret := e_error;
var GeoNetworkingInd v_msg;
f_sendGeoNetMessage(
m_geoNwReq(
m_geoNwPdu(
m_lsRequestHeader(
p_reqSrcPosVector,
p_reqSrcPosVector,
p_reqSeqNumber,
p_gnAddress
)
)
)
);
tc_ac.start;
alt {
[] geoNetworkingPort.receive(
mw_geoNwInd(
mw_geoNwPdu(
mw_lsReplyHeader(
p_reqSeqNumber,
?,
f_longPosVector2ShortPosVector(valueof(p_reqSrcPosVector))
)
)
)
) -> value v_msg {
tc_ac.stop;
p_repSrcPosVector := valueof(v_msg.msgIn.header.lsRequestHeader.srcPosVector);
v_ret := e_success;
}
}
return v_ret;
}
} // end preambles
group postambles {
/**
* @desc The default postamble.
*/
function f_poDefault() runs on ItsNt {
function f_poNeighbour() runs on ItsNt {
/**
* @desc Triggers event in the test system adaptation.
* @param p_event The event to trigger
* @return
function f_acTriggerEvent(template (value) AcGNEvent p_event) runs on ItsNt return FncRetCode {
var FncRetCode v_ret := e_success;
}
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
/**
* @desc Triggers event in the test system adaptation.
* @param p_event The event to trigger
* @return
*/
function f_acGetLongPosVector(template (value) GN_Address p_gnAddress) runs on ItsNt return LongPosVector {
var AcGNResult v_result;
f_acTriggerEvent(m_getLongPosVector(p_gnAddress));
tc_ac.start;
alt {
[] acPort.receive(mw_getLongPosVectorAny(p_gnAddress)) -> value v_result {
tc_ac.stop;
}
[] acPort.receive {
tc_ac.stop;
f_selfOrClientSyncAndVerdict("error", e_error, "*** f_acGetLongPosVector: Received unexpected message ***");
}
[] tc_ac.timeout {
f_selfOrClientSyncAndVerdict("error", e_timeout, "*** f_acGetLongPosVector: Timeout while waiting for adapter control event result ***");
}
}
return v_result.getLongPosVector;
}
function f_acStartBeaconingMultipleNeighbour(in integer p_numberOfNeighbour) runs on ItsNt return FncRetCode {
return f_acTriggerEvent(m_startBeaconingMultipleNeighbour(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader, p_numberOfNeighbour));
}
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
group commonFunctions {
/**
* @desc Gets the value of the lifetime in seconds.
* @return
*/
function f_getLifetimeValue(in Lifetime p_lifetime) runs on ItsNt return float {
var float v_lifetime := 0.0;
select (p_lifetime.ltBase) {
case (e_50ms) {
v_lifetime := int2float(p_lifetime.multiplier) * 0.5;
}
case (e_1s) {
v_lifetime := int2float(p_lifetime.multiplier) * 1.0;
}
case (e_10s) {
v_lifetime := int2float(p_lifetime.multiplier) * 10.0;
}
case (e_100s) {
v_lifetime := int2float(p_lifetime.multiplier) * 100.0;
}
}
return v_lifetime;
}
} // end commonFunctions
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
/**
* @desc Gets the tester GN local address for a specific node
*/
function f_getTsGnLocalAddress(in charstring p_node) return GN_Address {
var GN_Address v_gnAddr;
select (p_node) {
case (c_compNodeA) {
v_gnAddr := PX_TS_NODE_A_LOCAL_GN_ADDR;
}
case (c_compNodeB) {
v_gnAddr := PX_TS_NODE_B_LOCAL_GN_ADDR;
}
case (c_compNodeC) {
v_gnAddr := PX_TS_NODE_C_LOCAL_GN_ADDR;
}
case (c_compNodeD) {
v_gnAddr := PX_TS_NODE_D_LOCAL_GN_ADDR;
}
case else {
f_selfOrClientSyncAndVerdict("error", e_timeout, "*** f_getTsGnLocalAddress: Unknown node given ***");
}
}
return v_gnAddr;
}
* @desc Sends a GeoNetworking message and in case of an included sequence number in the message the
* local sequence number will be increased by one.
* @param p_geoNetReq The message to sent.
*/
function f_sendGeoNetMessage(in template (value) GeoNetworkingReq p_geoNetReq) runs on ItsNt {
geoNetworkingPort.send(p_geoNetReq);
if (not (ischosen(p_geoNetReq.msgOut.header.shbHeader) or ischosen(p_geoNetReq.msgOut.header.beaconHeader))) {
f_setLocalSequenceNumber();
}
/**
* @desc Sets the value of the sequence number for the next event.
* @return
*/
function f_setLocalSequenceNumber() runs on ItsNt {
}
} // end testerFunctions
group iutFunctions {
/**
* @desc Gets the IUT GN local address
*/
function f_getIutGnLocalAddress() return GN_Address {
return PICS_GN_LOCAL_GN_ADDR;
/**
* @desc Gets the IUT GN local address configuration method
*/
function f_getIutGnLocalAddressConfigurationMethod() return TypeOfAddress {
return PICS_GN_LOCAL_ADDR_CONF_METHOD;
}
/**
* @desc Gets the GeoUnicast forwarding algorithm
*/
function f_getGeoUnicastForwardingAlgorithm() return GeoUnicastForwardingAlgorithm {
return PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM;
}
/**
* @desc Gets the IUT default hop limit
*/
function f_getDefaultHopLimit() return UInt8 {
return PICS_GN_DEFAULT_HOP_LIMIT;
}
* @desc Gets the LS retransmission timer.. Valid for NetRepInterval = default (cong. ctrl).
* @return
*/
function f_getLSRetransmitTimer() return float {
var float v_itsGnLocationServiceRetransmitTimer := int2float(PICS_GN_LOCATION_SERVICE_RETRANSMIT_TIMER/1000);
return v_itsGnLocationServiceRetransmitTimer;
}
* @desc Gets the LS retransmission timer for NetRepInterval = medium (cong. ctrl).
* @return
*/
function f_getLSRetransmitTimerMedium() return float {
var float v_itsGnLocationServiceRetransmitTimerMedium := int2float(PX_GN_LOCATION_SERVICE_TIMER_MEDIUM/1000);
* @desc Gets the LS retransmission timer for NetRepInterval = maximum (cong. ctrl).
* @return
*/
function f_getLSRetransmitTimerMaximum() return float {
var float v_itsGnLocationServiceRetransmitTimerMaximum := int2float(PX_GN_LOCATION_SERVICE_TIMER_MAXIMUM/1000);
/**
* @desc Gets the App retransmission timer. Valid for AppRepInterval = default (cong. ctrl).
* @return
*/
function f_getAppRetransmitTimer() return float {
var float v_itsGnLocationApplicationRetransmitTimer := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER/1000);
}
/**
* @desc Gets the App retransmission timer for AppRepInterval = medium (cong. ctrl).
* @return
*/
function f_getAppRetransmitTimerMedium() return float {
var float v_itsGnLocationApplicationRetransmitTimerMedium := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER_MEDIUM/1000);
return v_itsGnLocationApplicationRetransmitTimerMedium;
}
/**
* @desc Gets the App retransmission timer for AppRepInterval = maximum (cong. ctrl).
* @return
*/
function f_getAppRetransmitTimerMaximum() return float {
var float v_itsGnLocationApplicationRetransmitTimerMaximum := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER_MAXIMUM/1000);
return v_itsGnLocationApplicationRetransmitTimerMaximum;
/**
* @desc Gets the LS maximum retransmission number.
* @return
*/
function f_getLSMaxRetrans() return integer {
var integer v_itsGnLocationServiceMaxRetrans := PICS_GN_LOCATION_SERVICE_MAX_RETRANS;
return v_itsGnLocationServiceMaxRetrans;
}
/**
* @desc Gets the Application maximum retransmission number.
* @return
*/
function f_getAppMaxRetrans() return integer {
var integer v_itsGnApplicationMaxRetrans := PICS_GN_APPLICATION_MAX_RETRANS;
return v_itsGnApplicationMaxRetrans;
/**
* @desc Gets the Location Service packet buffer size.
* @return
*/
function f_getLSPacketBufferSize() return integer {
var integer v_itsGnLocationServicePacketBufferSize := PICS_GN_LOCATION_SERVICE_PACKET_BUFFER_SIZE;
return v_itsGnLocationServicePacketBufferSize;
} // end f_getLSPacketBufferSize
/**
* @desc Gets the UC forwarding packet buffer size.
* @return
*/
function f_getUcForwardingPacketBufferSize() return integer {
var integer v_itsGnUcForwardingPacketBufferSize := PICS_GN_UC_FORWARDING_PACKET_BUFFER_SIZE;
return v_itsGnUcForwardingPacketBufferSize;
} // end f_getUcForwardingPacketBufferSize
/**
* @desc Gets the BC forwarding packet buffer size.
* @return
*/
function f_getBcForwardingPacketBufferSize() return integer {
var integer v_itsGnBcForwardingPacketBufferSize := PICS_GN_BC_FORWARDING_PACKET_BUFFER_SIZE;
return v_itsGnBcForwardingPacketBufferSize;
} // end f_getBcForwardingPacketBufferSize
/**
* @desc Gets the upper limit of the maximum lifetime.
* @return
*/
function f_getMaxPacketLifeTime() return float {
var float v_itsGnMaxPacketLifetime := int2float(PICS_GN_MAX_PACKET_LIFETIME);
return v_itsGnMaxPacketLifetime;
}
/**
* @desc Gets delta for timers.
* @return
*/
function f_getDeltaTimer() return float {
return v_deltaTimer;
}
/**
* @desc Gets the beacon service retransmit timer.
* @return
*/
function f_getBSRetransmitTimer() return float {
var float v_itsGnBeaconServiceRetransmitTimer;
v_itsGnBeaconServiceRetransmitTimer := int2float(
(PICS_GN_BEACON_SERVICE_TIMER+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000);
return v_itsGnBeaconServiceRetransmitTimer;
}
/**
* @desc Gets the beacon service retransmit timer for NetBeaconInterval = medium (cong. ctrl).
* @return
*/
function f_getBSRetransmitTimerMedium() return float {
var float v_itsGnBeaconServiceRetransmitTimerMedium; // timer value increased (medium)
v_itsGnBeaconServiceRetransmitTimerMedium := int2float(
(PX_GN_BEACON_SERVICE_TIMER_MEDIUM+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000);
}
/**
* @desc Gets the beacon service retransmit timer for NetBeaconInterval = maximum (cong. ctrl).
* @return
*/
function f_getBSRetransmitTimerMaximum() return float {
var float v_itsGnBeaconServiceRetransmitTimerMaximum; // timer value increased (maximum)
v_itsGnBeaconServiceRetransmitTimerMaximum := int2float(
(PX_GN_BEACON_SERVICE_TIMER_MAXIMUM+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000);
/**
* @desc Gets the maximum beacon service jitter.
* @return
*/
function f_getBSMaxJitter() return float {
var float v_itsGnBeaconServiceMaxJitter := (f_getMaxPacketLifeTime()*1000.0)/4.0;
return v_itsGnBeaconServiceMaxJitter;
}
/**
* @desc Gets the Lifetime of a Location Table Entry.
* @return
*/
function f_getLifetimeLocTE() return float {
var float v_itsGnLifetimeLocTE := int2float(PICS_GN_LIFETIME_LOC_TE);
return v_itsGnLifetimeLocTE;
} // end f_getLifetimeLocTE
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
/**
* @desc Gets the maximum communication range for CBF algorithm
*/
function f_getCbfMaxCommunicationRange() return integer {
var integer v_maxCommunicationRange := PICS_GN_DEFAULT_MAX_COMMUNICATION_RANGE;
return v_maxCommunicationRange;
} // end f_getCbfMaxCommunicationRange
function f_getGeoUnicastCbfMaxTime() return integer {
var integer v_cbfMaxTime := PICS_GN_GEOUNICAST_CBF_MAX_TIME;
return v_cbfMaxTime;
} // end f_getGeoUnicastCbfMaxTime
function f_getGeoUnicastCbfMinTime() return integer {
var integer v_cbfMinTime := PICS_GN_GEOUNICAST_CBF_MIN_TIME;
return v_cbfMinTime;
} // end f_getGeoUnicastCbfMinTime
/**
* @desc Set the number of neighbour in the Location Table.
* @return
*/
function f_setNrNeighbourLocTableDefault() {
var integer v_nrNeighbour := f_random (0, PX_MIN_NR_NEIGHBOUR);
f_acStartBeaconingMultipleNeighbour(v_nrNeighbour);
} // end f_setNrNeighbourLocTableDefault
/**
* @desc Set the number of neighbour in the Location Table.
* @return
*/
function f_setNrNeighbourLocTableMedium() {
var integer v_nrNeighbour := f_random (PX_MIN_NR_NEIGHBOUR, PX_MAX_NR_NEIGHBOUR);
f_acStartBeaconingMultipleNeighbour(v_nrNeighbour);
} // end f_setNrNeighbourLocTableMedium
/**
* @desc Set the number of neighbour in the Location Table.
* @return
*/
function f_setNrNeighbourLocTableMaximum() {
var integer v_nrNeighbour := f_random (PX_MAX_NR_NEIGHBOUR, (2*PX_MIN_NR_NEIGHBOUR));
f_acStartBeaconingMultipleNeighbour(v_nrNeighbour);
} // end f_setNrNeighbourLocTableMaximum
} // end iutFunctions
function f_longPosVector2ShortPosVector(in LongPosVector p_longPosVector) return ShortPosVector {
var ShortPosVector v_shortPosVector;
v_shortPosVector := {
gnAddr := p_longPosVector.gnAddr,
timestamp := p_longPosVector.timestamp,
latitude := p_longPosVector.latitude,
longitude := p_longPosVector.longitude
};
function f_getIutLongPosVector() return LongPosVector {
return f_acGetLongPosVector(f_getIutGnLocalAddress());
}
function f_getIutShortPosVector() return ShortPosVector {
return f_longPosVector2ShortPosVector(f_getIutLongPosVector());
/**
* @desc Compute a position using a reference position, a distance and an orientation
* @param p_iutLongPosVector Reference position
* @param p_distance Distance to the reference position (in meter)
* @param p_orientation direction of the computed position (0 to 359; 0 means North)
* @return LongPosVector
*/
function f_computePositionUsingDistance(in LongPosVector p_iutLongPosVector, in integer p_distance, in integer p_orientation)
return LongPosVector {
var LongPosVector v_result := p_iutLongPosVector;
fx_computePositionUsingDistance(p_iutLongPosVector, p_distance, p_orientation, v_result.latitude, v_result.longitude);
return v_result;
}
group externalFunctions {
external function fx_computeDistance(
in UInt32 p_latitudeA, in UInt32 p_longitudeA,
in UInt32 p_latitudeB, in UInt32 p_longitudeB
) return float;
/**
* @desc Compute a position using a reference position, a distance and an orientation
* @param p_iutLongPosVector Reference position
* @param p_distance Distance to the reference position (in meter)
* @param p_orientation direction of the computed position (0 to 359; 0 means North)
* @return LongPosVector
*/
function fx_computePositionUsingDistance(
in LongPosVector p_iutLongPosVector,
in integer p_distance,
in integer p_orientation,
out UInt32 p_latitude,
out UInt32 p_longitude
);