Newer
Older
/**
* @author ETSI / STF405
* @version $URL$
* $Id$
* @desc Module containing functions for GeoNetworking
*
*/
module LibItsGeoNetworking_Functions {
// Libcommon
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_VerdictControl {type FncRetCode;}
import from LibCommon_Sync {altstep all};
// LibIts
import from LibIts_TestSystem all;
import from LibIts_Interface all;
/**
* @desc Create Facility component and connects GeoNetworking port
* @param p_ptcDenm returned Facility component variable
*/
function f_ptcGeoNetworkingUp(out ItsNt p_ptcGeoNetworking) {
p_ptcGeoNetworking := ItsNt.create("GeoNetworking Tester");
// map ports
map(p_ptcGeoNetworking:geoNetworkingPort, system:geoNetworkingPort);
/**
* @desc Wait for component to finish and unmap GeoNetworking ports
function f_ptcGeoNetworkingDown(in ItsNt p_ptcGeoNetworking) runs on ItsMtc {
tc_guard.start;
alt {
[] p_ptcGeoNetworking.done {
tc_guard.stop;
}
[] tc_guard.timeout {
log("*** f_ptcGeoNetworkingDown: ERROR: Timeout while waiting for component ***");
setverdict(inconc);
}
}
unmap(p_ptcGeoNetworking:geoNetworkingPort);
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
group geoConfigurationFunctions {
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - two ITS nodes (nodeA, nodeB)
*/
function f_cf01Up() runs on ItsNt {
// Variables
var PositionTable v_positionTable := {};
// Map
map(self:geoNetworkingPort, system:geoNetworkingPort);
// Position table
f_addPosition(v_positionTable, c_compIut, f_getIutLongPosVector());
f_addPosition(v_positionTable, c_compNodeA, f_computePosition());
f_addPosition(v_positionTable, c_compNodeB, f_computePosition());
f_initialiseComponent(v_positionTable, c_compNodeB);
} // end f_cf01Up
/**
* @desc Deletes configuration cf01
*/
function f_cf01Down() runs on ItsNt {
// Map
unmap(self:geoNetworkingPort, system:geoNetworkingPort);
} // end f_cf01Down
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeA)
* - one ITS node (NodeB)
* - Area1 which only includes Tester
* Tester being close to the area center
*
* @param p_nodeA
* @param p_nodeB
*/
function f_cf02Up(out ItsNt p_nodeA, out ItsNt p_nodeB) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
// Create
p_nodeA := ItsNt.create(c_compNodeA) alive;
p_nodeB := ItsNt.create(c_compNodeB) alive;
// Map
map(p_nodeA:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
// Connect
connect(p_nodeA:syncPort, self:syncPort);
connect(p_nodeB:syncPort, self:syncPort);
// Position table
f_addPosition(v_positionTable, c_compIut, f_getIutLongPosVector());
f_addPosition(v_positionTable, c_compNodeA, f_computePosition());
f_addPosition(v_positionTable, c_compNodeB, f_computePosition());
p_nodeA.start(f_initialiseComponent(v_positionTable, c_compNodeA));
p_nodeB.start(f_initialiseComponent(v_positionTable, c_compNodeB));
p_nodeA.done;
p_nodeB.done;
} // end f_cf02Up
/**
* @desc Deletes configuration cf02
* @param p_nodeA
* @param p_nodeB
*/
function f_cf02Down(in ItsNt p_nodeA, in ItsNt p_nodeB) runs on ItsMtc {
// Map
unmap(p_nodeA:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
// Connect
disconnect(p_nodeA:syncPort, self:syncPort);
disconnect(p_nodeB:syncPort, self:syncPort);
} // end f_cf02Down
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeA)
* - one ITS node not in direction of NodeA (NodeB)
* - one ITS node in direction of Tester (NodeC)
* - Area1 which only includes NodeA, NodeB and IUT,
*/
function f_cf03Up(out ItsNt p_nodeA, out ItsNt p_nodeB, out ItsNt p_nodeC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
// Create
p_nodeA := ItsNt.create(c_compNodeA) alive;
p_nodeB := ItsNt.create(c_compNodeB) alive;
p_nodeC := ItsNt.create(c_compNodeC) alive;
// Map
map(p_nodeA:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
// Connect
connect(p_nodeA:syncPort, self:syncPort);
connect(p_nodeB:syncPort, self:syncPort);
connect(p_nodeC:syncPort, self:syncPort);
// Position table
f_addPosition(v_positionTable, c_compIut, f_getIutLongPosVector());
f_addPosition(v_positionTable, c_compNodeA, f_computePosition());
f_addPosition(v_positionTable, c_compNodeB, f_computePosition());
f_addPosition(v_positionTable, c_compNodeC, f_computePosition());
p_nodeA.start(f_initialiseComponent(v_positionTable, c_compNodeA));
p_nodeB.start(f_initialiseComponent(v_positionTable, c_compNodeB));
p_nodeC.start(f_initialiseComponent(v_positionTable, c_compNodeC));
p_nodeA.done;
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_nodeA, in ItsNt p_nodeB, in ItsNt p_nodeC) runs on ItsMtc {
// Map
unmap(p_nodeA:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
// Connect
disconnect(p_nodeA:syncPort, self:syncPort);
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)
* - Area2 which only includes NodeA, NodeB and NodeD,
* NodeB being close to the area center
*/
function f_cf04Up(out ItsNt p_nodeA, out ItsNt p_nodeB, out ItsNt p_nodeC, out ItsNt p_nodeD) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
// Create
p_nodeA := ItsNt.create(c_compNodeA) alive;
p_nodeB := ItsNt.create(c_compNodeB) alive;
p_nodeC := ItsNt.create(c_compNodeC) alive;
p_nodeD := ItsNt.create(c_compNodeD) alive;
// Map
map(p_nodeA:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
map(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
// Connect
connect(p_nodeA:syncPort, self:syncPort);
connect(p_nodeB:syncPort, self:syncPort);
connect(p_nodeC:syncPort, self:syncPort);
connect(p_nodeD:syncPort, self:syncPort);
// Position table
f_addPosition(v_positionTable, c_compIut, f_getIutLongPosVector());
f_addPosition(v_positionTable, c_compNodeA, f_computePosition());
f_addPosition(v_positionTable, c_compNodeB, f_computePosition());
f_addPosition(v_positionTable, c_compNodeC, f_computePosition());
f_addPosition(v_positionTable, c_compNodeD, f_computePosition());
p_nodeA.start(f_initialiseComponent(v_positionTable, c_compNodeA));
p_nodeB.start(f_initialiseComponent(v_positionTable, c_compNodeB));
p_nodeC.start(f_initialiseComponent(v_positionTable, c_compNodeC));
p_nodeD.start(f_initialiseComponent(v_positionTable, c_compNodeD));
p_nodeA.done;
p_nodeB.done;
p_nodeC.done;
p_nodeD.done;
} // end f_cf04Up
/**
* @desc Deletes configuration cf04
* @param p_nodeA
* @param p_nodeB
* @param p_nodeC
* @param p_nodeD
*/
function f_cf04Down(in ItsNt p_nodeA, in ItsNt p_nodeB, in ItsNt p_nodeC, in ItsNt p_nodeD) runs on ItsMtc {
// Map
unmap(p_nodeA:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
unmap(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
// Connect
disconnect(p_nodeA:syncPort, self:syncPort);
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
} // end geoConfigurationFunctions
group geoPositionFunctions {
function f_addPosition(
inout PositionTable p_positionTable,
in charstring p_positionKey,
in LongPosVector p_positionValue) {
// TODO
}
function f_getPosition(
in PositionTable p_positionTable,
in charstring p_positionKey)
return LongPosVector {
var LongPosVector v_return;
// TODO
return v_return;
}
function f_computePosition() return LongPosVector {
var LongPosVector v_return;
// TODO
return v_return;
}
} // end geoPositionFunctions
* @desc The base default.
*/
altstep a_default() runs on ItsNt {
var LongPosVector v_iutLongPosVector;
[] a_receiveLsRequest(
?, ?, ?, v_iutLongPosVector
) {
repeat;
}
[] geoNetworkingPort.receive {
setverdict (inconc, "*** INCONC: Received an unexpected message ***");
//TODO shall stop be called here?
stop;
}
[] tc_wait.timeout {
setverdict (inconc, "*** INCONC: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
//TODO shall stop be called here?
stop;
}
[] tc_ac.timeout {
setverdict (inconc, "*** INCONC: Timeout while awaiting the reception of a message ***");
//TODO shall stop be called here?
stop;
}
f_poDefault();
log("*** a_default: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
stop;
}
altstep a_neighbourDefault() runs on ItsNt {
[] a_receiveLsRequestAndReply(
?, ?, f_getPosition(vc_positionTable, vc_componentName).gnAddr,
f_getPosition(vc_positionTable, vc_componentName),
f_getPosition(vc_positionTable, vc_componentName),
e_vehicleStation
) {
repeat;
}
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) StationTypeIdentifier p_stationType,
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
*/
altstep a_receiveAnyGeoUnicast() runs on ItsNt {
[] a_receiveGeoUnicast(?, ?, ?, ?) {}
}
} // end geoGeoUnicastAltsteps
group geoLocationServiceAltsteps {
/**
* @desc Receive Location Service Request
*/
altstep a_receiveLsRequest(
in template (present) StationTypeIdentifier p_stationType,
in template (present) UInt16 p_seqNumber,
in template (present) GN_Address p_gnAddress,
out template (value) LongPosVector p_reqSrcPosVector
var GeoNetworkingInd v_msg;
[] geoNetworkingPort.receive(
mw_geoNwInd(
mw_geoNwPdu(
mw_lsRequestHeader(
p_stationType,
p_seqNumber,
p_gnAddress
)
)
)
) -> value v_msg {
p_reqSrcPosVector := 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) StationTypeIdentifier p_reqStationType,
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,
in template (value) StationTypeIdentifier p_repStationType
var LongPosVector v_repDstPosVector;
[] a_receiveLsRequest(p_reqStationType, p_reqSeqNumber, p_gnAddress, v_repDstPosVector) {
f_sendGeoNetMessage(m_geoNwReq(m_geoNwPdu(
m_lsReplyHeader(
p_repSrcPosVector,
v_repDstPosVector,
vc_localSeqNumber
))));
}
}
} // 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 {
activate(a_neighbourDefault());
f_taStartBeaconing(
m_beaconHeader(
f_getPosition(vc_positionTable, vc_componentName)
)
);
}
/**
* @desc Brings the IUT into an initial state.
* @return
*/
// TODO: any specific action ?
setverdict(pass);
}
522
523
524
525
526
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
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
function f_handleLocationService(
in template (present) StationTypeIdentifier p_reqStationType,
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,
in template (value) StationTypeIdentifier p_repStationType
) runs on ItsNt {
tc_ac.start;
alt {
[] a_receiveLsRequestAndReply(p_reqStationType, p_reqSeqNumber, p_gnAddress,
p_repSrcPosVector, p_repSenderPosVector, p_repStationType) {
tc_ac.stop;
}
}
}
function f_processLocationService(
in template (value) LongPosVector p_reqSrcPosVector,
in template (value) StationTypeIdentifier p_reqStationType,
in template (value) UInt16 p_reqSeqNumber,
in template (value) GN_Address p_gnAddress,
out template (value) LongPosVector p_repSrcPosVector
) 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_reqStationType,
p_reqSeqNumber,
p_gnAddress
)
)
)
);
tc_ac.start;
alt {
[] geoNetworkingPort.receive(
mw_geoNwInd(
mw_geoNwPdu(
mw_lsReplyHeader(
p_reqSeqNumber,
?,
p_reqSrcPosVector
)
)
)
) -> value v_msg {
tc_ac.stop;
p_repSrcPosVector := 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 {
setverdict(pass);
}
function f_poNeighbour() runs on ItsNt {
f_taStopBeaconing(vc_componentName);
f_poDefault();
}
group upperTester {
function f_utGenerateIpv6Message() runs on ItsNt {
//TODO
}
function f_utGenerateSHBMessage() runs on ItsNt {
//TODO
}
function f_utCheckEvent(/*FIXME*/) runs on ItsNt return FncRetCode {
var FncRetCode v_ret := e_error;
//TODO
return v_ret;
}
} // end upperTester
group testAdapter {
function f_taStartBeaconing(in template (value) Header p_beaconHeader) {
//TODO
function f_taStopBeaconing(in charstring p_compName) {
//TODO
function f_taStartPassBeaconing(in template (value) Header p_beaconHeader) {
//TODO
}
function f_taStopPassBeaconing() {
//TODO
}
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
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
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();
}
}
function f_getTesterLongPosVector() return LongPosVector {
//TODO
function f_getTesterGnAddress() return GN_Address {
var GN_Address v_gnAddress;
//TODO
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
/**
* @desc Sets the value of the sequence number for the next event.
* @return
*/
function f_setLocalSequenceNumber() runs on ItsNt {
vc_localSeqNumber := (vc_localSeqNumber + 1) mod c_uInt16Max; //TODO check if c_uInt16Max should be replaced by module parameter
}
} // end testerFunctions
group iutFunctions {
function f_getIutGnAddress() return GN_Address {
var GN_Address v_gnAddress;
//TODO
return v_gnAddress;
}
/**
* @desc Gets the LS retransmission timer.
* @return
*/
function f_getLSRetransmitTimer() return float {
var float v_itsGnLocationServiceRetransmitTimer := 1.0;
//TODO get the value from PIXIT or MIB
return v_itsGnLocationServiceRetransmitTimer;
}
/**
* @desc Gets the LS maximum retransmission number.
* @return
*/
function f_getLSMaxRetrans() return integer {
var integer v_itsGnLocationServiceMaxRetrans := 10;
//TODO get the value from PIXIT or MIB
return v_itsGnLocationServiceMaxRetrans;
}
/**
* @desc Gets the upper limit of the maximum lifetime.
* @return
*/
function f_getMaxPacketLifeTime() return float {
var float v_itsGnMaxPacketLifetime := 600.0;
//TODO get the value from PIXIT or MIB
return v_itsGnMaxPacketLifetime;
}
/**
* @desc Gets delta for timers.
* @return
*/
function f_getDeltaTimer() return float {
var float v_deltaTimer := 0.1;
//TODO get the value from PIXIT
return v_deltaTimer;
}
/**
* @desc Gets the beacon service retransmit timer.
* @return
*/
function f_getBSRetransmitTimer() return float {
var float v_itsGnBeaconServiceRetransmitTimer := 3.0;
//TODO get the value from PIXIT
return v_itsGnBeaconServiceRetransmitTimer;
}
/**
* @desc Gets the maximum beacon service jitter.
* @return
*/
function f_getBSMaxJitter() return float {
var float v_itsGnBeaconServiceMaxJitter := f_getMaxPacketLifeTime()/4.0;
//TODO get the value from PIXIT or from the above calculation
return v_itsGnBeaconServiceMaxJitter;
}
/**
* @desc Gets the Lifetime of a Location Table Entry.
* @return
*/
function f_getLifetimeLocTE() return float {
var float v_itsGnLifetimeLocTE := 20.0;
//TODO get the value from PIXIT or from the above calculation
return v_itsGnLifetimeLocTE;
} // end f_getLifetimeLocTE
} // end iutFunctions
group neighborFunctions {
function f_getNeighborLongPosVector() return LongPosVector {
var LongPosVector v_longPosVector;
//TODO
return v_longPosVector;
}
} // end testerFunctions
group posVectorFunctions {
function f_longPosVector2ShortPosVector(in LongPosVector p_longPosVector) return ShortPosVector {
var ShortPosVector v_shortPosVector;
v_shortPosVector := {
gnAddr := p_longPosVector.gnAddr,
timestamp := p_longPosVector.timestamp,
latitute := p_longPosVector.latitute,
longitude := p_longPosVector.longitude
};
function f_getIutLongPosVector() return LongPosVector {
var LongPosVector v_longPosVector;
//TODO
return v_longPosVector;
}
function f_getIutShortPosVector() return ShortPosVector {
return f_longPosVector2ShortPosVector(f_getIutLongPosVector());