/** * @author ETSI / STF405 * @version $URL$ * $Id$ * @desc GeoNetworking Templates * */ module LibItsGeoNetworking_Templates { // Libcommon import from LibCommon_BasicTypesAndValues all; import from LibCommon_DataStrings all; // LibIts import from LibIts_Interface all; import from LibItsGeoNetworking_TypesAndValues all; import from LibItsGeoNetworking_Pixits all; import from LibItsCommon_TypesAndValues all; group geoNwPrimitivesTemplates { /** * @desc Send template for GeoNetworking packet (GeonetworkingPort Primitive) * @param p_geoNwMsg GeoNetworking packet to be sent */ template (value) GeoNetworkingReq m_geoNwReq( template (value) GeoNetworkingPacket p_geoNwMsg ) := { msgOut := p_geoNwMsg } /** * @desc Receive template for GeoNetworking packet (GeonetworkingPort Primitive) * @param p_geoNwMsg GeoNetworking packet to be received */ template GeoNetworkingInd mw_geoNwInd( template (present) GeoNetworkingPacket p_geoNwMsg ) := { msgIn := p_geoNwMsg } group utPrimitives { /** * @desc Initializes the GN IUT. */ template (value) UtInitialize m_gnInitialize := { utGNInitialize := { } } /** * @desc Request IUT to send a GeoUnicast message to a specific destination * @param p_destinationGnAddr Destination of the GeoUnicast message */ template UtEvent m_generateGeoUnicastMessage(GN_Address p_destinationGnAddr) := { utGnEvent := { geoUnicast := { gnAddress := p_destinationGnAddr, lifetime := omit, payload := omit } } } /** * @desc Request IUT to send a GeoUnicast message to a specific destination with specific lifetime * @param p_destinationGnAddr Destination of the GeoUnicast message * @param p_lifetime Lifetime of the GeoUnicast message * @see m_generateGeoUnicastMessage */ template UtEvent m_generateGeoUnicastMessageWithLifetime( GN_Address p_destinationGnAddr, integer p_lifetime ) modifies m_generateGeoUnicastMessage := { utGnEvent := { geoUnicast := { lifetime := p_lifetime } } } /** * @desc Request IUT to send a GeoUnicast message to a specific destination with a payload * @param p_destinationGnAddr Destination of the GeoUnicast message * @param p_payload Payload of the GeoUnicast message * @see m_generateGeoUnicastMessage */ template UtEvent m_generateGeoUnicastMessageWithPayload( GN_Address p_destinationGnAddr, Payload p_payload ) modifies m_generateGeoUnicastMessage := { utGnEvent := { geoUnicast := { payload := p_payload } } } /** * @desc Request IUT to send a GeoBroadcast message to a specific area * @param p_area Destination area of the message */ template UtEvent m_generateGeoBroadcastMessage( GeoArea p_area ) := { utGnEvent := { geoBroadcast := { area := p_area, payload := omit } } } /** * @desc Request IUT to send a GeoBroadcast message to a specific area with a payload * @param p_area Destination area of the message * @param p_payload Payload of the GeoBroadcast message * @see m_generateGeoBroadcastMessage */ template UtEvent m_generateGeoBroadcastMessageWithPayload( GeoArea p_area, Payload p_payload ) modifies m_generateGeoBroadcastMessage := { utGnEvent := { geoBroadcast := { payload := p_payload } } } /** * @desc Request IUT to send a GeoAnycast message to a specific area * @param p_area Destination area of the message */ template UtEvent m_generateGeoAnycastMessage( GeoArea p_area ) := { utGnEvent := { geoAnycast := { area := p_area, payload := omit } } } /** * @desc Request IUT to send a GeoAnycast message to a specific area with a payload * @param p_area Destination area of the message * @param p_payload Payload of the GeoAnycast message * @see m_generateGeoAnycastMessage */ template UtEvent m_generateGeoAnycastMessageWithPayload( GeoArea p_area, Payload p_payload ) modifies m_generateGeoAnycastMessage := { utGnEvent := { geoAnycast := { payload := p_payload } } } /** * @desc Request IUT to send a SHB message */ template UtEvent m_generateSHBMessage := { utGnEvent := { shb := { payload := omit } } } /** * @desc Request IUT to send a SHB message with a payload * @param p_payload Payload of the SHB message * @see m_generateSHBMessage */ template UtEvent m_generateSHBMessageWithPayload( Payload p_payload ) modifies m_generateSHBMessage := { utGnEvent := { shb := { payload := p_payload } } } /** * @desc Request IUT to send a TSB message */ template UtEvent m_generateTSBMessage := { utGnEvent := { tsb := { payload := omit } } } /** * @desc Request IUT to change its position */ template (value) UtEvent m_changePosition := { utGnEvent := { changePosition := {} } } /** * @desc Checks the receive of a packet * @param p_packet The GN packet to check */ template (value) UtEvent m_checkPacket(GeoNetworkingPacket p_packet) := { utGnEvent := { checkPacket := p_packet } } } // end utPrimitives group taPrimitives { /** * @desc Testsystem will start beaconing for the given neighbor * @param p_beaconHeader The neighbor information */ template (value) AcGNEvent m_startBeaconing( template (value) BeaconHeader p_beaconHeader ) := { startBeaconing := { beaconHeader := p_beaconHeader } } /** * @desc Testsystem will stop beaconing for the given neighbor * @param p_compName The neighbor */ template AcGNEvent m_stopBeaconing := { stopBeaconing:= { } } /** * @desc Testsystem will pass received to the TTCN-3 * @param p_beaconHeader The neighbor information */ template AcGNEvent m_startPassBeaconing( template (value) BeaconHeader p_beaconHeader ) := { startPassBeaconing := { beaconHeader := p_beaconHeader } } /** * @desc Testsystem will stop passing beacon information to the TTCN-3 */ template AcGNEvent m_stopPassBeaconing := { stopPassBeaconing := { } } } // end taPrimitives } // geoNwPrimitivesTemplates group geoNwPduTemplates { /** * @desc Send template for GeoNetworking PDU * @param p_header Header value of GeoNetworking message */ template (value) GeoNetworkingPacket m_geoNwPdu( in template (value) Header p_header ) := { header := p_header, secHeader := omit, payload := omit } /** * @desc Send template for GeoNetworking PDU with payload * @param p_header Header value of GeoNetworking message * @param p_payload Payload * @see m_geoNwPdu */ template (value) GeoNetworkingPacket m_geoNwPduWithPayload( in template (value) Header p_header, in template (value) Payload p_payload ) modifies m_geoNwPdu := { payload := p_payload } /** * @desc Receive template for GeoNetworking PDU * @param p_header Header value of GeoNetworking message */ template GeoNetworkingPacket mw_geoNwPdu( in template (present) Header p_header ) := { header := p_header, secHeader := *, payload := * } /** * @desc Receive template for GeoNetworking PDU with any payload * @param p_header Header value of GeoNetworking message * @see mw_geoNwPdu */ template GeoNetworkingPacket mw_geoNwPduAnyPayload( in template (present) Header p_header ) modifies mw_geoNwPdu := { payload := ? } /** * @desc Receive template for GeoNetworking PDU with payload * @param p_header Header value of GeoNetworking message * @param p_payload Payload * @see mw_geoNwPdu */ template GeoNetworkingPacket mw_geoNwPduWithPayload( in template (present) Header p_header, in template (present) Payload p_payload ) modifies mw_geoNwPdu := { payload := p_payload } } // end geoNwPduTemplates group geoNwHeadersTemplates { group geoNwCommonHeaderTemplates { /** * @desc Send template for Common header * @param p_nextHeader Id of next header * @param p_headerTST Header's type and sub-type * @param p_trafficClass Packet's traffic class * @param p_hopLimit Maximum number of hops * @param p_senderPosVec Long position vector of sender * @remark plLength field is set to 0 and has to be computed by codec */ template (value) CommonHeader m_commonHeader ( in template (value) NextHeader p_nextHeader, in template (value) HeaderTST p_headerTST, in template (value) TrafficClass p_trafficClass, in template (value) UInt8 p_hopLimit, in template (value) LongPosVector p_senderPosVec ) := { version := c_geoNwProtocolVersion, nextHeader := p_nextHeader, headerTST := p_headerTST, reserved := c_uInt8Zero, flags := c_8ZeroBits, plLength := 0, // will be computed by Codec trafficClass := p_trafficClass, hopLimit := p_hopLimit, senderPosVector := p_senderPosVec } /** * @desc Receive template for Common header * @param p_senderLongPosVec Long position vector of sender * @param p_nextHeader Id of next header * @param p_headerTST Header's type and sub-type */ template CommonHeader mw_commonHeader ( in template (present) LongPosVector p_senderLongPosVec, in template (present) NextHeader p_nextHeader, in template (present) HeaderTST p_headerTST ) := { version := c_geoNwProtocolVersion, nextHeader := p_nextHeader, headerTST := p_headerTST, reserved := c_uInt8Zero, flags := c_8ZeroBits, plLength := ?, trafficClass := ?, hopLimit := ?, senderPosVector := p_senderLongPosVec } /** * @desc Receive template for Beacon header * @param p_trafficClass Packet's traffic class * @param p_hopLimit Maximum number of hops * @param p_senderLongPosVec Long position vector of sender */ template CommonHeader mw_commonHeaderBeacon ( in template (present) TrafficClass p_trafficClass, in template (present) UInt8 p_hopLimit, in template (present) LongPosVector p_senderLongPosVec ) := { version := c_geoNwProtocolVersion, nextHeader := e_any, // 0 headerTST := { beaconHdr := { headerType := e_beacon, // 1 headerSubType := 0 } }, reserved := c_uInt8Zero, flags := c_8ZeroBits, plLength := 0, trafficClass := p_trafficClass, hopLimit := p_hopLimit, senderPosVector := p_senderLongPosVec } /** * @desc Receive template for Common header with specific Hop limit * @param p_senderLongPosVec Long position vector of sender * @param p_nextHeader Id of next header * @param p_headerTST Header's type and sub-type * @param p_hopLimit Maximum number of hops * @see mw_commonHeader */ template CommonHeader mw_commonHeaderWithHopLimit ( in template (present) LongPosVector p_senderLongPosVec, in template (present) NextHeader p_nextHeader, in template (present) HeaderTST p_headerTST, in template (present) UInt8 p_hopLimit ) modifies mw_commonHeader := { hopLimit := p_hopLimit } /** * @desc Receive template for Common header with specific Hop limit * @param p_senderLongPosVec Long position vector of sender * @param p_nextHeader Id of next header * @param p_headerTST Header's type and sub-type * @param p_trafficClass Packet's traffic class */ template CommonHeader mw_commonHeaderWithTrafficClass ( in template (present) LongPosVector p_senderLongPosVec, in template (present) NextHeader p_nextHeader, in template (present) HeaderTST p_headerTST, in template (present) TrafficClass p_trafficClass ) modifies mw_commonHeader := { trafficClass := p_trafficClass } /** * @desc Default send template for traffic class */ template (value) TrafficClass m_trafficClass := { reserved := c_uInt1Zero, relevance := c_uInt3Zero, reliability := e_veryHigh, latency := e_veryLow } /** * @desc Receive template for traffic class * @param p_reliability Reliability * @param p_latency Latency */ template TrafficClass mw_trafficClass( in template (present) Reliability p_reliability, in template (present) Latency p_latency ) := { reserved := c_uInt1Zero, relevance := c_uInt3Zero, reliability := p_reliability, latency := p_latency } /** * @desc Receive template for any GN_Address */ template GN_Address mw_gnAddressAny := { typeOfAddress := ?, stationType := ?, stationSubType := ?, stationCountryCode := ?, mid := ? } /** * @desc Receive template for GN_Address * @param p_stationType Station's type * @param p_stationSubType Station's sub-type * @param p_stationCountryCode Station's country code */ template GN_Address mw_gnAddress( in template (present) StationType p_stationType, in template (present) StationSubType p_stationSubType, in template (present) UInt10 p_stationCountryCode ) := { typeOfAddress := ?, stationType := p_stationType, stationSubType := p_stationSubType, stationCountryCode := p_stationCountryCode, mid := ? } /** * @desc Receive template for long position vector with specific GN_Address * @param p_gnAddress GN_Address to be contained in the long position vector */ template LongPosVector mw_longPosVectorAny( in template (present) GN_Address p_gnAddress ) := { gnAddr := p_gnAddress, timestamp := ?, latitude := ?, longitude := ?, speed := ?, heading := ?, altitude := ?, timeAccuracy := ?, posAccuracy := ?, speedAccuracy := ?, headingAccuracy := ?, altitudeAccuracy := ? } /** * @desc Receive template for long position vector with position check with delta * @param p_longPosVector The base long position vector */ template LongPosVector mw_longPosVectorPosition( in template (value) LongPosVector p_longPosVector ) := { gnAddr := p_longPosVector.gnAddr, timestamp := ?, latitude := (p_longPosVector.latitude-PX_POS_DELTA..p_longPosVector.latitude+PX_POS_DELTA), longitude := (p_longPosVector.longitude-PX_POS_DELTA..p_longPosVector.longitude+PX_POS_DELTA), speed := (p_longPosVector.speed-PX_POS_DELTA..p_longPosVector.speed+PX_POS_DELTA), heading := p_longPosVector.heading, altitude := (p_longPosVector.altitude-PX_POS_DELTA..p_longPosVector.altitude+PX_POS_DELTA), timeAccuracy := ?, posAccuracy := ?, speedAccuracy := ?, headingAccuracy := ?, altitudeAccuracy := ? } /** * @desc Receive template for short position vector with position check with delta * @param p_shortPosVector The base short position vector */ template ShortPosVector mw_shortPosVectorPosition( in template (value) ShortPosVector p_shortPosVector ) := { gnAddr := p_shortPosVector.gnAddr, timestamp := ?, latitude := (p_shortPosVector.latitude-PX_POS_DELTA..p_shortPosVector.latitude+PX_POS_DELTA), longitude := (p_shortPosVector.longitude-PX_POS_DELTA..p_shortPosVector.longitude+PX_POS_DELTA) } } // end geoNwCommonHeaderTemplates group geoUnicastHeaderTemplates { /** * @desc Send template for GeoUnicast header * @param p_sourceLongPosVec Long position vector of source * @param p_destinationLongPosVec Long position vector of destination * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoUnicast packet */ template (value) Header m_geoUnicastHeader( in template (value) LongPosVector p_sourceLongPosVec, in template (value) ShortPosVector p_destinationLongPosVec, in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber ) := { geoUnicastHeader := { commonHeader := m_commonHeader( e_ipv6, m_geoUnicastHeaderType, m_trafficClass, c_defaultHopLimit, p_senderLongPosVec ), seqNumber := p_seqNumber, lifetime := m_defaultLifetime, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, dstPosVector := p_destinationLongPosVec } } /** * @desc Send template for GeoUnicast header with Hop limit * @param p_sourceLongPosVec Long position vector of source * @param p_destinationLongPosVec Long position vector of destination * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoUnicast packet * @param p_hopLimit Maximum number of hops * @see m_geoUnicastHeader */ template (value) Header m_geoUnicastHeaderWithHopLimit( in template (value) LongPosVector p_sourceLongPosVec, in template (value) ShortPosVector p_destinationLongPosVec, in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber, in template (value) UInt8 p_hopLimit ) modifies m_geoUnicastHeader := { geoUnicastHeader := { commonHeader := { hopLimit := p_hopLimit } } } /** * @desc Receive template for GeoUnicast header * @param p_senderLongPosVec Long position vector of sender * @param p_destinationShortPosVec Long position vector of destination * @param p_seqNumber Sequence number of GeoUnicast packet */ template Header mw_geoUnicastHeader( in template (present) LongPosVector p_senderLongPosVec, in template (present) ShortPosVector p_destinationShortPosVec, in template (present) UInt16 p_seqNumber ) := { geoUnicastHeader := { commonHeader := mw_commonHeader( p_senderLongPosVec, ?, mw_geoUnicastHeaderType ), seqNumber := p_seqNumber, lifetime := ?, reserved := ?, srcPosVector := ?, dstPosVector := p_destinationShortPosVec } } /** * @desc Receive template for GeoUnicast header with source long position vector * @param p_senderLongPosVec Long position vector of sender * @param p_destinationShortPosVec Long position vector of destination * @param p_seqNumber Sequence number of GeoUnicast packet * @param p_srcLongPosVec Long position vector of source * @see mw_geoUnicastHeader */ template Header mw_geoUnicastHeaderWithSourcePv( in template (present) LongPosVector p_senderLongPosVec, in template (present) ShortPosVector p_destinationShortPosVec, in template (present) UInt16 p_seqNumber, in template (present) LongPosVector p_srcLongPosVec ) modifies mw_geoUnicastHeader := { geoUnicastHeader := { srcPosVector := p_srcLongPosVec } } /** * @desc Receive template for GeoUnicast header with source long position vector * @param p_senderLongPosVec Long position vector of sender * @param p_destinationShortPosVec Long position vector of destination * @param p_seqNumber Sequence number of GeoUnicast packet * @param p_hopLimit Maximum number of hops * @see mw_geoUnicastHeader */ template Header mw_geoUnicastHeaderWithHopLimit( in template (present) LongPosVector p_senderLongPosVec, in template (present) ShortPosVector p_destinationShortPosVec, in template (present) UInt16 p_seqNumber, in template (present) UInt8 p_hopLimit ) modifies mw_geoUnicastHeader := { geoUnicastHeader := { commonHeader := { hopLimit := p_hopLimit } } } /** * @desc Receive template for GeoUnicast header with common header and lifetime * @param p_senderLongPosVec Long position vector of sender * @param p_destinationShortPosVec Long position vector of destination * @param p_stationType Station type of sender * @param p_seqNumber Sequence number of GeoUnicast packet * @param p_commonHeader Common header * @param p_lifetime lifetime of the packet */ template Header mw_geoUnicastHeaderWithCommonHeaderWithLifetime( in template (present) LongPosVector p_sourceLongPosVec, in template (present) ShortPosVector p_destinationLongPosVec, in template (present) UInt16 p_seqNumber, in template (present) CommonHeader p_commonHeader, in template (present) Lifetime p_lifetime ) := { geoUnicastHeader := { commonHeader := p_commonHeader, seqNumber := p_seqNumber, lifetime := p_lifetime, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, dstPosVector := p_destinationLongPosVec } } /** * @desc Send template for GeoUnicast header type */ template (value) HeaderTST m_geoUnicastHeaderType := { geoUnicastHdr := { headerType := e_geoUnicast, headerSubType := c_uInt4Zero } } /** * @desc Receive template for GeoUnicast header type */ template HeaderTST mw_geoUnicastHeaderType := { geoUnicastHdr := { headerType := e_geoUnicast, headerSubType := c_uInt4Zero } } } // end geoUnicastHeaderTemplates group geoBroadcastHeaderTemplates { /** * @desc Send template for GeoBroadcast header * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoBroadcast packet * @param p_broadcastArea Destination GeoArea */ template (value) Header m_geoBroadcastHeader( in template (value) LongPosVector p_sourceLongPosVec, in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber, in template (value) GeoBroadcastArea p_broadcastArea ) := { geoBroadcastHeader := { commonHeader := m_commonHeader( e_btp, m_geoBroadcastHeaderType(p_broadcastArea.geoBroadcastSubType), m_trafficClass, c_defaultHopLimit, p_senderLongPosVec ), seqNumber := p_seqNumber, lifetime := m_defaultLifetime, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, geoAreaPosLatitude := p_broadcastArea.geoBroadcastArea.geoAreaPosLatitude, geoAreaPosLongitude := p_broadcastArea.geoBroadcastArea.geoAreaPosLongitude, distanceA := p_broadcastArea.geoBroadcastArea.distanceA, distanceB := p_broadcastArea.geoBroadcastArea.distanceB, angle := p_broadcastArea.geoBroadcastArea.angle, reserved2 := c_uInt24Zero } } /** * @desc Send template for GeoBroadcast header with hop limit * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_stationType Station type of sender * @param p_seqNumber Sequence number of GeoBroadcast packet * @param p_broadcastArea Destination GeoArea * @param p_hopLimit Maximum number of hops * @see m_geoBroadcastHeader */ template (value) Header m_geoBroadcastHeaderWithHopLimit( in template (value) LongPosVector p_sourceLongPosVec, in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber, in template (value) GeoBroadcastArea p_broadcastArea, in template (value) UInt8 p_hopLimit ) modifies m_geoBroadcastHeader := { geoBroadcastHeader := { commonHeader := m_commonHeader( e_btp, m_geoBroadcastHeaderType(p_broadcastArea.geoBroadcastSubType), m_trafficClass, p_hopLimit, p_senderLongPosVec ) } } /** * @desc Receive template for GeoBroadcast header for any GeoArea * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoBroadcast packet */ template Header mw_geoBroadcastHeader( in template (present) LongPosVector p_sourceLongPosVec, in template (present) LongPosVector p_senderLongPosVec, in template (present) UInt16 p_seqNumber ) := { geoBroadcastHeader := { commonHeader := mw_commonHeader( p_senderLongPosVec, ?, mw_geoBroadcastHeaderType ), seqNumber := p_seqNumber, lifetime := ?, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, geoAreaPosLatitude := ?, geoAreaPosLongitude := ?, distanceA := ?, distanceB := ?, angle := ?, reserved2 := c_uInt24Zero } } /** * @desc Receive template for GeoBroadcast header * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoBroadcast packet * @param p_broadcastArea Destination GeoArea * @see mw_geoBroadcastHeader */ template Header mw_geoBroadcastHeaderWithArea ( in template (present) LongPosVector p_sourceLongPosVec, in template (present) LongPosVector p_senderLongPosVec, in template (present) UInt16 p_seqNumber, in template (present) GeoBroadcastArea p_broadcastArea ) modifies mw_geoBroadcastHeader := { geoBroadcastHeader := { commonHeader := mw_commonHeader( p_senderLongPosVec, ?, mw_geoBroadcastHeaderTypeWithSubType(p_broadcastArea.geoBroadcastSubType) ), geoAreaPosLatitude := p_broadcastArea.geoBroadcastArea.geoAreaPosLatitude, geoAreaPosLongitude := p_broadcastArea.geoBroadcastArea.geoAreaPosLongitude, distanceA := p_broadcastArea.geoBroadcastArea.distanceA, distanceB := p_broadcastArea.geoBroadcastArea.distanceB, angle := p_broadcastArea.geoBroadcastArea.angle } } /** * @desc Receive template for GeoBroadcast header with Hop limit * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoBroadcast packet * @param p_broadcastArea Destination GeoArea * @param p_hopLimit Maximum number of hops * @see mw_geoBroadcastHeaderWithArea */ template Header mw_geoBroadcastHeaderWithAreaWithHopLimit( in template (present) LongPosVector p_sourceLongPosVec, in template (present) LongPosVector p_senderLongPosVec, in template (present) UInt16 p_seqNumber, in template (present) GeoBroadcastArea p_broadcastArea, in template (present) UInt8 p_hopLimit ) modifies mw_geoBroadcastHeaderWithArea := { geoBroadcastHeader := { commonHeader := mw_commonHeaderWithHopLimit( p_senderLongPosVec, ?, mw_geoBroadcastHeaderType, p_hopLimit ) } } /** * @desc Receive template for GeoBroadcast header with common header and lifetime * @param p_sourceLongPosVec Long position vector of source * @param p_seqNumber Sequence number of GeoBroadcast packet * @param p_broadcastArea Destination GeoArea * @param p_commonHeader Common header * @param p_lifetime Lifetime of the GeoBroadcast packet */ template Header mw_geoBroadcastHeaderWithAreaWithChWithLt( in template (present) LongPosVector p_sourceLongPosVec, in template (present) UInt16 p_seqNumber, in template (present) GeoBroadcastArea p_broadcastArea, in template (present) CommonHeader p_commonHeader, in template (present) Lifetime p_lifetime ) := { geoBroadcastHeader := { commonHeader := p_commonHeader, seqNumber := p_seqNumber, lifetime := p_lifetime, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, geoAreaPosLatitude := p_broadcastArea.geoBroadcastArea.geoAreaPosLatitude, geoAreaPosLongitude := p_broadcastArea.geoBroadcastArea.geoAreaPosLongitude, distanceA := p_broadcastArea.geoBroadcastArea.distanceA, distanceB := p_broadcastArea.geoBroadcastArea.distanceB, angle := p_broadcastArea.geoBroadcastArea.angle, reserved2 := c_uInt24Zero } } /** * @desc Send template for GeoBroadcast header type * @param p_headerSubType Packet's subtype */ template (value) HeaderTST m_geoBroadcastHeaderType( in template (value) HeaderSubTypeGeoBroadcast p_headerSubType ) := { geoBroadcastHdr := { headerType := e_geoBroadcast, headerSubType := p_headerSubType } } /** * @desc Receive template for GeoBroadcast header type */ template HeaderTST mw_geoBroadcastHeaderType := { geoBroadcastHdr := { headerType := e_geoBroadcast, headerSubType := ? } } /** * @desc Receive template for GeoBroadcast header type with sub-type * @param p_headerSubType Packet's subtype * @see mw_geoBroadcastHeaderType */ template HeaderTST mw_geoBroadcastHeaderTypeWithSubType( in template (present) HeaderSubTypeGeoBroadcast p_headerSubType ) modifies mw_geoBroadcastHeaderType := { geoBroadcastHdr := { headerSubType := p_headerSubType } } /** * @desc Default send template for Lifetime field */ template (value) Lifetime m_defaultLifetime := { multiplier := c_defaultLifetime, ltBase := e_1s } /** * @desc Receive template for lifetime 0 */ template (present) Lifetime mw_lifetime0 := { multiplier := 0, ltBase := ? } } // end geoBroadcastHeaderTemplates group geoAnycastHeaderTemplates { /** * @desc Send template for GeoAnycast header * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoAnycast packet * @param p_anycastArea Destination GeoArea */ template (value) Header m_geoAnycastHeader( in template (value) LongPosVector p_sourceLongPosVec, in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber, in template (value) GeoAnycastArea p_anycastArea ) := { geoAnycastHeader := { commonHeader := m_commonHeader( e_btp, m_geoAnycastHeaderType(p_anycastArea.geoAnycastSubType), m_trafficClass, c_defaultHopLimit, p_senderLongPosVec ), seqNumber := p_seqNumber, lifetime := m_defaultLifetime, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, geoAreaPosLatitude := p_anycastArea.geoAnycastArea.geoAreaPosLatitude, geoAreaPosLongitude := p_anycastArea.geoAnycastArea.geoAreaPosLongitude, distanceA := p_anycastArea.geoAnycastArea.distanceA, distanceB := p_anycastArea.geoAnycastArea.distanceB, angle := p_anycastArea.geoAnycastArea.angle, reserved2 := c_uInt24Zero } } /** * @desc Send template for GeoAnycast header with hop limit * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoAnycast packet * @param p_anycastArea Destination GeoArea * @param p_hopLimit Maximum number of hops * @see m_geoAnycastHeader */ template (value) Header m_geoAnycastHeaderWithHopLimit( in template (value) LongPosVector p_sourceLongPosVec, in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber, in template (value) GeoAnycastArea p_anycastArea, in template (value) UInt8 p_hopLimit ) modifies m_geoAnycastHeader := { geoAnycastHeader := { commonHeader := m_commonHeader( e_btp, m_geoAnycastHeaderType(p_anycastArea.geoAnycastSubType), m_trafficClass, p_hopLimit, p_senderLongPosVec ) } } /** * @desc Receive template for GeoAnycast header for any GeoArea * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoAnycast packet */ template Header mw_geoAnycastHeader( in template (present) LongPosVector p_sourceLongPosVec, in template (present) LongPosVector p_senderLongPosVec, in template (present) UInt16 p_seqNumber ) := { geoAnycastHeader := { commonHeader := mw_commonHeader( p_senderLongPosVec, ?, mw_geoAnycastHeaderType ), seqNumber := p_seqNumber, lifetime := ?, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, geoAreaPosLatitude := ?, geoAreaPosLongitude := ?, distanceA := ?, distanceB := ?, angle := ?, reserved2 := c_uInt24Zero } } /** * @desc Receive template for GeoAnycast header * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoAnycast packet * @param p_anycastArea Destination GeoArea * @see mw_geoAnycastHeader */ template Header mw_geoAnycastHeaderWithArea ( in template (present) LongPosVector p_sourceLongPosVec, in template (present) LongPosVector p_senderLongPosVec, in template (present) UInt16 p_seqNumber, in template (present) GeoAnycastArea p_anycastArea ) modifies mw_geoAnycastHeader := { geoAnycastHeader := { commonHeader := mw_commonHeader( p_senderLongPosVec, ?, mw_geoAnycastHeaderTypeWithSubType(p_anycastArea.geoAnycastSubType) ), geoAreaPosLatitude := p_anycastArea.geoAnycastArea.geoAreaPosLatitude, geoAreaPosLongitude := p_anycastArea.geoAnycastArea.geoAreaPosLongitude, distanceA := p_anycastArea.geoAnycastArea.distanceA, distanceB := p_anycastArea.geoAnycastArea.distanceB, angle := p_anycastArea.geoAnycastArea.angle } } /** * @desc Receive template for GeoAnycast header with Hop limit * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoAnycast packet * @param p_anycastArea Destination GeoArea * @param p_hopLimit Maximum number of hops * @see mw_geoAnycastHeaderWithArea */ template Header mw_geoAnycastHeaderWithAreaWithHopLimit( in template (present) LongPosVector p_sourceLongPosVec, in template (present) LongPosVector p_senderLongPosVec, in template (present) UInt16 p_seqNumber, in template (present) GeoAnycastArea p_anycastArea, in template (present) UInt8 p_hopLimit ) modifies mw_geoAnycastHeaderWithArea := { geoAnycastHeader := { commonHeader := mw_commonHeaderWithHopLimit( p_senderLongPosVec, ?, mw_geoAnycastHeaderType, p_hopLimit ) } } /** * @desc Receive template for GeoAnycast header with common header and lifetime * @param p_sourceLongPosVec Long position vector of source * @param p_seqNumber Sequence number of GeoAnycast packet * @param p_anycastArea Destination GeoArea * @param p_commonHeader Common header * @param p_lifetime Lifetime of the GeoAnycast packet */ template Header mw_geoAnycastHeaderWithAreaWithChWithLt( in template (present) LongPosVector p_sourceLongPosVec, in template (present) UInt16 p_seqNumber, in template (present) GeoAnycastArea p_anycastArea, in template (present) CommonHeader p_commonHeader, in template (present) Lifetime p_lifetime ) := { geoAnycastHeader := { commonHeader := p_commonHeader, seqNumber := p_seqNumber, lifetime := p_lifetime, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, geoAreaPosLatitude := p_anycastArea.geoAnycastArea.geoAreaPosLatitude, geoAreaPosLongitude := p_anycastArea.geoAnycastArea.geoAreaPosLongitude, distanceA := p_anycastArea.geoAnycastArea.distanceA, distanceB := p_anycastArea.geoAnycastArea.distanceB, angle := p_anycastArea.geoAnycastArea.angle, reserved2 := c_uInt24Zero } } /** * @desc Send template for GeoBroadcast header type with sub-type * @param p_headerSubType Packet's subtype */ template (value) HeaderTST m_geoAnycastHeaderType( in template (value) HeaderSubTypeGeoAnycast p_headerSubType ) := { geoAnycastHdr := { headerType := e_geoAnycast, headerSubType := p_headerSubType } } /** * @desc Receive template for GeoBroadcast header */ template HeaderTST mw_geoAnycastHeaderType := { geoAnycastHdr := { headerType := e_geoAnycast, headerSubType := ? } } /** * @desc Receive template for GeoBroadcast header type with sub-type * @param p_headerSubType Packet's subtype * @see mw_geoAnycastHeaderType */ template HeaderTST mw_geoAnycastHeaderTypeWithSubType( in template (present) HeaderSubTypeGeoAnycast p_headerSubType ) modifies mw_geoAnycastHeaderType := { geoAnycastHdr := { headerSubType := p_headerSubType } } } // end geoAnycastHeaderTemplates group lsRequestHeaderTemplates { /** * @desc Send template for LS Request header * @param p_sourceLongPosVec Long position vector of source * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of LS Request packet * @param p_gnAddress Searched GN_Address */ template (value) Header m_lsRequestHeader( in template (value) LongPosVector p_sourceLongPosVec, in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber, in template (value) GN_Address p_gnAddress ) := { lsRequestHeader := { commonHeader := m_commonHeader( e_btp, m_lsRequestHeaderType, m_trafficClass, c_defaultHopLimit, p_senderLongPosVec ), seqNumber := p_seqNumber, lifetime := m_defaultLifetime, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, gnAddress := p_gnAddress } } /** * @desc Receive template for LS Request header * @param p_seqNumber Sequence number of LS Request packet * @param p_gnAddress Searched GN_Address */ template Header mw_lsRequestHeader( in template (present) UInt16 p_seqNumber, in template (present) GN_Address p_gnAddress ) := { lsRequestHeader := { commonHeader := mw_commonHeader( ?, e_any, mw_lsRequestHeaderType ), seqNumber := p_seqNumber, lifetime := ?, reserved := ?, srcPosVector := ?, gnAddress := p_gnAddress } } /** * @desc Receive template for LS Request header with hop limit * @param p_seqNumber Sequence number of LS Request packet * @param p_gnAddress Searched GN_Address * @param p_hopLimit Maximum number of hops * @see mw_lsRequestHeader */ template Header mw_lsRequestHeader_withHopLimit( in template (present) UInt16 p_seqNumber, in template (present) GN_Address p_gnAddress, in template (present) UInt8 p_hopLimit ) modifies mw_lsRequestHeader := { lsRequestHeader := { commonHeader := { hopLimit := p_hopLimit } } } /** * @desc Send template for LS Request header type */ template (value) HeaderTST m_lsRequestHeaderType := { lsHdr := { headerType := e_locationService, headerSubType := e_lsRequest } } /** * @desc Receive template for LS Request header type */ template HeaderTST mw_lsRequestHeaderType := { lsHdr := { headerType := e_locationService, headerSubType := e_lsRequest } } } // end lsRequestHeaderTemplates group lsReplyHeaderTemplates { /** * @desc Send template for LS Reply header * @param p_sourceLongPosVec Long position vector of source * @param p_destinationLongPosVec Long position vector of destination * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of LS Reply packet */ template (value) Header m_lsReplyHeader( in template (value) LongPosVector p_sourceLongPosVec, in template (value) ShortPosVector p_destinationLongPosVec, in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber ) := { lsReplyHeader := { commonHeader := m_commonHeader( e_btp, m_lsRequestHeaderType, m_trafficClass, c_defaultHopLimit, p_senderLongPosVec ), seqNumber := p_seqNumber, lifetime := m_defaultLifetime, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, dstPosVector := p_destinationLongPosVec } } /** * @desc Receive template for any LS Reply header * @param p_seqNumber Sequence number of LS Reply packet */ template Header mw_lsReplyHeaderAny( in template (present) UInt16 p_seqNumber ) := { lsReplyHeader := { commonHeader := mw_commonHeader( ?, e_any, m_lsReplyHeaderType ), seqNumber := p_seqNumber, lifetime := ?, reserved := ?, srcPosVector := ?, dstPosVector := ? } } /** * @desc Receive template for LS Reply header * @param p_seqNumber Sequence number of LS Reply packet * @param p_sourceLongPosVec Long position vector of source * @param p_destinationLongPosVec Short position vector of destination * @see mw_lsReplyHeaderAny */ template Header mw_lsReplyHeader( in template (present) UInt16 p_seqNumber, in template (present) LongPosVector p_sourceLongPosVec, in template (present) ShortPosVector p_destinationLongPosVec) modifies mw_lsReplyHeaderAny := { lsReplyHeader := { srcPosVector := p_sourceLongPosVec, dstPosVector := p_destinationLongPosVec } } /** * @desc Send template for LS Reply header type */ template (value) HeaderTST m_lsReplyHeaderType := { lsHdr := { headerType := e_locationService, headerSubType := e_lsReply } } } // end lsRequestHeaderTemplates group beaconHeaderTemplates { /** * @desc Send template for Beacon header * @param p_senderLongPosVec Long position vector of sender */ template (value) Header m_beaconHeader( in template (value) LongPosVector p_senderLongPosVec ) := { beaconHeader := { commonHeader := m_commonHeader( e_btp, m_beaconHeaderType, m_trafficClass, c_defaultHopLimit, p_senderLongPosVec ) } } /** * @desc Receive template for Beacon header * @param p_trafficClass Packet's traffic class * @param p_hopLimit Maximum number of hops * @param p_senderLongPosVec Long position vector of sender */ template Header mw_beaconHeader( in template (present) TrafficClass p_trafficClass, in template (present) UInt8 p_hopLimit, in template (present) LongPosVector p_senderLongPosVec ) := { beaconHeader := { commonHeader := mw_commonHeaderBeacon( p_trafficClass, p_hopLimit, p_senderLongPosVec ) } } /** * @desc Send template for Beacon header type */ template (value) HeaderTST m_beaconHeaderType := { beaconHdr := { headerType := e_beacon, headerSubType := c_uInt4Zero } } /** * @desc Receive template for Beacon header type */ template HeaderTST mw_beaconHeaderType := { beaconHdr := { headerType := e_beacon, headerSubType := ? } } } // end beaconHeaderTemplates group shbHeaderTemplates { /** * @desc Send template for SHB header * @param p_senderLongPosVec Long position vector of sender */ template (value) Header m_shbHeader( in template (value) LongPosVector p_senderLongPosVec ) := { shbHeader := { commonHeader := m_commonHeader( e_any, m_shbHeaderType, m_trafficClass, c_defaultHopLimit, p_senderLongPosVec ) } } /** * @desc Receive template for SHB header */ template Header mw_shbHeader := { shbHeader := { commonHeader := mw_commonHeaderWithHopLimit( ?, // SE PV ?, // NH m_shbHeaderType, // HT + HST 1 // HL ) } } /** * @desc Send template for SHB header type */ template (value) HeaderTST m_shbHeaderType := { tsbHdr := { headerType := e_topologicallyScopedBroadcast, headerSubType := e_singleHop } } } // end shbHeaderTemplates group tsbHeaderTemplates { /** * @desc Send template for TSB header * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of TSB packet * @param p_srcPosVector Long position vector of source */ template Header m_tsbHeader( in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber, in template (value) LongPosVector p_srcPosVector ) := { tsbHeader := { commonHeader := m_commonHeader( e_any, m_shbHeaderType, m_trafficClass, c_defaultHopLimit, p_senderLongPosVec ), seqNumber := p_seqNumber, lifetime := m_defaultLifetime, reserved := c_uInt8Zero, srcPosVector := p_srcPosVector } } /** * @desc Send template for TSB header with hop limit * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of TSB packet * @param p_srcPosVector Long position vector of source * @param p_hopLimit Maximum number of hops */ template Header m_tsbHeaderWithHopLimit( in template (value) LongPosVector p_senderLongPosVec, in template (value) UInt16 p_seqNumber, in template (value) LongPosVector p_srcPosVector, in template (value) UInt8 p_hopLimit ) modifies m_tsbHeader := { tsbHeader := { commonHeader := { hopLimit := p_hopLimit } } } /** * @desc Receive template for TSB header * @param p_seqNumber Sequence number of TSB packet * @param p_sourceLongPosVec Long position vector of source */ template Header mw_tsbHeader( in template (present) UInt16 p_seqNumber, in template (present) LongPosVector p_sourceLongPosVec ) := { tsbHeader := { commonHeader := mw_commonHeader( ?, e_any, m_tsbHeaderType ), seqNumber := p_seqNumber, lifetime := ?, reserved := ?, srcPosVector := p_sourceLongPosVec } } /** * @desc Receive template for TSB header with sender position vector * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of TSB packet * @param p_sourceLongPosVec Long position vector of source */ template Header mw_tsbHeaderWithSenderPv( in template (present) LongPosVector p_senderLongPosVec, in template (present) UInt16 p_seqNumber, in template (present) LongPosVector p_sourceLongPosVec ) := { tsbHeader := { commonHeader := mw_commonHeader( p_senderLongPosVec, e_any, m_tsbHeaderType ), seqNumber := p_seqNumber, lifetime := ?, reserved := ?, srcPosVector := p_sourceLongPosVec } } /** * @desc Receive template for TSB header with hop limit * @param p_seqNumber Sequence number of TSB packet * @param p_sourceLongPosVec Long position vector of source * @param p_hopLimit Maximum number of hops */ template Header mw_tsbHeaderWithHopLimit( in template (present) UInt16 p_seqNumber, in template (present) LongPosVector p_sourceLongPosVec, in template (present) UInt8 p_hopLimit ) modifies mw_tsbHeader := { tsbHeader := { commonHeader := { hopLimit := p_hopLimit } } } /** * @desc Send template for TSB header type */ template (value) HeaderTST m_tsbHeaderType := { tsbHdr := { headerType := e_topologicallyScopedBroadcast, headerSubType := e_multiHop } } } // end tsbHeaderTemplates } // end geoNwHeadersTemplates group geoPayloadTemplates { /** * @desc Receive template for misc. payload * @param p_payload Payload */ template Payload mw_otherPayload( in template (present) octetstring p_payload ) := { otherPayload := p_payload } } // end geoPayloadTemplates group geoMiscTemplates { group geoDummyTemplates { /** * @desc Dummy template for GN_Address */ template (value) GN_Address m_dummyGnAddr := { typeOfAddress := e_manual, stationType := { vehicleStation := { stationType := e_vehicleStation, vsKind := e_car } }, stationSubType := e_private, stationCountryCode := c_uInt10Zero, mid := c_6ZeroBytes } /** * @desc Dummy template for long position vector */ template (value) LongPosVector m_dummyLongPosVector := { gnAddr := m_dummyGnAddr, timestamp := c_uInt32Zero, latitude := c_uInt32Zero, longitude := c_uInt32Zero, speed := c_uInt16Zero, heading := c_uInt16Zero, altitude := c_uInt16Zero, timeAccuracy := c_uInt4Zero, posAccuracy := c_uInt4Zero, speedAccuracy := c_uInt3Zero, headingAccuracy := c_uInt3Zero, altitudeAccuracy := c_uInt2Zero } /** * @desc Dummy template for Area */ template (value) Area m_dummyArea := { geoAreaPosLatitude := c_uInt32Zero, geoAreaPosLongitude := c_uInt32Zero, distanceA := c_uInt16Zero, distanceB := c_uInt16Zero, angle := c_uInt8Zero } /** * @desc Dummy template for GeoBroadcastArea */ template (value) GeoBroadcastArea m_dummyGeoBroadcastArea := { geoBroadcastSubType := e_geoBroadcastRect, geoBroadcastArea := m_dummyArea } } // end geoDummyTemplates } // end geoMiscTemplates } // end ItsGeoNetworking_Templates