/** * @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 LibItsIpv6OverGeoNetworking_TypesAndValues all; import from LibItsIpv6OverGeoNetworking_Templates all; import from LibItsBtp_Templates all; import from LibItsGeoNetworking_Pixits all; import from LibItsCommon_TypesAndValues all; import from LibItsExternal_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_linkLayerBroadcast( template (value) GeoNetworkingPacket p_geoNwMsg ) := { msgOut := p_geoNwMsg, macDestinationAddress := c_llBroadcast } /** * @desc Send template for GeoNetworking packet (GeonetworkingPort Primitive) * @param p_geoNwMsg GeoNetworking packet to be sent * @param p_llDestinationAdress Link-layer destination address */ template (value) GeoNetworkingReq m_geoNwReq_withLinkLayerDestination( template (value) GeoNetworkingPacket p_geoNwMsg, template (value) MacAddress p_llDestinationAdress ) modifies m_geoNwReq_linkLayerBroadcast := { macDestinationAddress := p_llDestinationAdress } /** * @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, macDestinationAddress := ? } /** * @desc Receive template for GeoNetworking packet (GeonetworkingPort Primitive) * @param p_geoNwMsg GeoNetworking packet to be received * @param p_llDestinationAdress Link-layer destination address */ template GeoNetworkingInd mw_geoNwInd_withLinkLayerDestination( template (present) GeoNetworkingPacket p_geoNwMsg, template (present) MacAddress p_llDestinationAdress ) modifies mw_geoNwInd := { macDestinationAddress := p_llDestinationAdress } 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, octetstring p_payload ) modifies m_generateGeoUnicastMessage := { utGnEvent := { geoUnicast := { payload := { otherPayload := p_payload} // do not use f_adaptPayload_m here } } } /** * @desc Request IUT to send a GeoUnicast message to a specific destination with specific lifetime with specific payload * @param p_destinationGnAddr Destination of the GeoUnicast message * @param p_lifetime Lifetime of the GeoUnicast message * @param p_payload Payload of the GeoUnicast message * @see m_generateGeoUnicastMessage */ template UtEvent m_generateGeoUnicastMessageWithLifetimeWithPayload( GN_Address p_destinationGnAddr, integer p_lifetime, octetstring p_payload ) modifies m_generateGeoUnicastMessageWithLifetime := { utGnEvent := { geoUnicast := { payload := { otherPayload := p_payload} // do not use f_adaptPayload_m here } } } /** * @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, lifetime := omit } } } /** * @desc Request IUT to send a GeoBroadcast message to a specific area * @param p_area Destination area of the message * @param p_lifetime Packet's lifetime */ template UtEvent m_generateGeoBroadcastMessageWithLifetime( GeoArea p_area, integer p_lifetime ) modifies m_generateGeoBroadcastMessage := { utGnEvent := { geoBroadcast := { lifetime := p_lifetime } } } /** * @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, octetstring p_payload ) modifies m_generateGeoBroadcastMessage := { utGnEvent := { geoBroadcast := { payload := { otherPayload := p_payload} // do not use f_adaptPayload_m here } } } /** * @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, lifetime := 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, octetstring p_payload ) modifies m_generateGeoAnycastMessage := { utGnEvent := { geoAnycast := { payload := { otherPayload := p_payload} // do not use f_adaptPayload_m here } } } /** * @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( octetstring p_payload ) modifies m_generateShbMessage := { utGnEvent := { shb := { payload := { otherPayload := p_payload} // do not use f_adaptPayload_m here } } } /** * @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(template (value) 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) AcGnPrimitive 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 AcGnPrimitive m_stopBeaconing := { stopBeaconing:= { } } /** * @desc Testsystem will pass received to the TTCN-3 * @param p_beaconHeader The neighbor information */ template AcGnPrimitive m_startPassBeaconing( template (value) BeaconHeader p_beaconHeader ) := { startPassBeaconing := { beaconHeader := p_beaconHeader } } /** * @desc Testsystem will stop passing beacon information to the TTCN-3 */ template AcGnPrimitive m_stopPassBeaconing := { stopPassBeaconing := { } } /** * @desc Testsystem will start beaconing for multiple neighbors * @param p_beaconHeader The neighbor information * @param p_numberOfNeighbour The number of ITS stations for which TS will send beacons */ template (value) AcGnPrimitive m_startBeaconingMultipleNeighbour( template (value) BeaconHeader p_beaconHeader, integer p_numberOfNeighbour ) := { startBeaconingMultipleNeighbour := { beaconHeader := p_beaconHeader, numberOfNeighbour := p_numberOfNeighbour } } /** * @desc Testsystem will stop beaconing for multiple neighbors * @param p_compName The neighbor */ template AcGnPrimitive m_stopBeaconingMultipleNeighbour := { stopBeaconingMultipleNeighbour:= { } } /** * @desc Testsystem will reply the LongPosVector including the requested GN address * found in received beacon information to the TTCN-3 * @param p_gnAddress The GN address included in the LongPosVector */ template AcGnPrimitive m_getLongPosVector(GN_Address p_gnAddress) := { getLongPosVector := { gnAddress := p_gnAddress } } /** * @desc Receive template adapter control result for long position vector with specific GN_Address * @param p_gnAddress GN_Address to be contained in the long position vector */ template AcGnResponse mw_getLongPosVectorAny(template (present) GN_Address p_gnAddress) := { getLongPosVector := mw_longPosVectorAny(p_gnAddress) } } // end taPrimitives } // geoNwPrimitivesTemplates group geoNwPduTemplates { /** * @desc Send template for GeoNetworking PDU (includes a default payload) * @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 := f_adaptPayload_m(char2oct("DEFAULT_PAYLOAD")) } /** * @desc Send template for GeoNetworking PDU with no payload * @param p_header Header value of GeoNetworking message */ template (value) GeoNetworkingPacket m_geoNwPduNoPayload( in template (value) Header p_header ) modifies m_geoNwPdu := { payload := omit } /** * @desc Send template for GeoNetworking PDU with octetstring payload * @param p_header Header value of GeoNetworking message * @param p_payload Octetstring payload * @see m_geoNwPdu */ template (value) GeoNetworkingPacket m_geoNwPduWithOctetstringPayload( in template (value) Header p_header, in template (value) octetstring p_payload ) modifies m_geoNwPdu := { payload := f_adaptPayload_m(valueof(p_payload)) } /** * @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 octetstring payload * @param p_header Header value of GeoNetworking message * @param p_payload Octetstring payload * @see mw_geoNwPdu */ template GeoNetworkingPacket mw_geoNwPduWithOctetstringPayload( in template (present) Header p_header, in template (present) octetstring p_payload ) modifies mw_geoNwPdu := { payload := f_adaptPayload_mw(p_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_headerTypeSubType 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_headerTypeSubType, 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_headerTypeSubType, 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_headerTypeSubType 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_headerTypeSubType ) := { version := c_geoNwProtocolVersion, nextHeader := p_nextHeader, headerTST := p_headerTypeSubType, reserved := c_uInt8Zero, flags := ?, plLength := ?, trafficClass := ?, hopLimit := ?, senderPosVector := p_senderLongPosVec } /** * @desc Receive template for Beacon common 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, headerTST := { beaconHdr := { headerType := e_beacon, headerSubType := 0 } }, reserved := c_uInt8Zero, flags := ?, 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_headerTypeSubType 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_headerTypeSubType, in template (present) UInt8 p_hopLimit ) modifies mw_commonHeader := { hopLimit := p_hopLimit } /** * @desc Receive template for Common header with specific Traffic Class * @param p_senderLongPosVec Long position vector of sender * @param p_nextHeader Id of next header * @param p_headerTypeSubType 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_headerTypeSubType, 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 strict position check * @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, longitude := p_longPosVector.longitude, speed := p_longPosVector.speed, heading := p_longPosVector.heading, altitude := p_longPosVector.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_withDelta( in template (value) LongPosVector p_longPosVector ) modifies mw_longPosVectorPosition := { latitude := (valueof(p_longPosVector.latitude)-PX_POS_DELTA .. valueof(p_longPosVector.latitude)+PX_POS_DELTA), longitude := (valueof(p_longPosVector.longitude)-PX_POS_DELTA .. valueof(p_longPosVector.longitude)+PX_POS_DELTA), speed := (valueof(p_longPosVector.speed)-PX_POS_DELTA .. valueof(p_longPosVector.speed)+PX_POS_DELTA), altitude := (valueof(p_longPosVector.altitude)-PX_POS_DELTA .. valueof(p_longPosVector.altitude)+PX_POS_DELTA) } /** * @desc Receive template for short position vector with strict position check * @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, longitude := p_shortPosVector.longitude } /** * @desc Receive template for short position vector with position check with delta * @param p_shortPosVector The base short position vector */ template ShortPosVector mw_shortPosVectorPosition_withDelta( in template (value) ShortPosVector p_shortPosVector ) modifies mw_shortPosVectorPosition := { latitude := (valueof(p_shortPosVector.latitude)-PX_POS_DELTA..valueof(p_shortPosVector.latitude)+PX_POS_DELTA), longitude := (valueof(p_shortPosVector.longitude)-PX_POS_DELTA..valueof(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( PX_GN_UPPER_LAYER, 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 Send template for GeoUnicast header with Lifetime * @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_lifetime Packet's lifetime * @see m_geoUnicastHeader */ template (value) Header m_geoUnicastHeaderWithLifetime( 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) Lifetime p_lifetime ) modifies m_geoUnicastHeader := { geoUnicastHeader := { lifetime := p_lifetime } } /** * @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 specific hop limit * @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_sourceLongPosVec Long position vector of source * @param p_destinationLongPosVec Long position vector of destination * @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( PX_GN_UPPER_LAYER, 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_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( PX_GN_UPPER_LAYER, 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_100s } /** * @desc Send template for Lifetime field (Base = 1s) */ template (value) Lifetime m_lifetimeBase1s( in template (value) UInt6 p_multiplier ) := { multiplier := p_multiplier, 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( PX_GN_UPPER_LAYER, 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( PX_GN_UPPER_LAYER, 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 GeoAnycast header type with any sub-type */ template HeaderTST mw_geoAnycastHeaderType := { geoAnycastHdr := { headerType := e_geoAnycast, headerSubType := ? } } /** * @desc Receive template for GeoAnycast 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_any, 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_mid Searched GN_Address MID */ template Header mw_lsRequestHeader( in template (present) UInt16 p_seqNumber, in template (present) GN_Address.mid p_mid ) := { lsRequestHeader := { commonHeader := mw_commonHeader( ?, e_any, mw_lsRequestHeaderType ), seqNumber := p_seqNumber, lifetime := ?, reserved := ?, srcPosVector := ?, gnAddress := mw_gnAddressMid(p_mid) } } /** * @desc Receive template for LS Request header with hop limit * @param p_seqNumber Sequence number of LS Request packet * @param p_mid Searched GN_Address MID * @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.mid p_mid, 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_any, m_lsReplyHeaderType, 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 := { lsReplyHeader := { commonHeader := mw_commonHeader( ?, e_any, m_lsReplyHeaderType ), 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) 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_any, 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( PX_GN_UPPER_LAYER, 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( PX_GN_UPPER_LAYER, m_tsbHeaderType, 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( ?, ?, 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) UInt16 p_seqNumber, in template (present) LongPosVector p_sourceLongPosVec, in template (present) LongPosVector p_senderLongPosVec ) modifies mw_tsbHeader := { tsbHeader := { commonHeader := mw_commonHeader( p_senderLongPosVec, ?, m_tsbHeaderType ) } } /** * @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 { /** * @desc Receive template for GN_Address. Only M_ID field is discriminent * @param p_mid Expected GN Address MID */ template GN_Address mw_gnAddressMid(in template (present) GN_Address.mid p_mid) := { typeOfAddress := ?, stationType := ?, stationSubType := ?, stationCountryCode := ?, mid := p_mid } 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_uInt16Zero } /** * @desc Dummy template for GeoBroadcastArea */ template (value) GeoBroadcastArea m_dummyGeoBroadcastArea := { geoBroadcastSubType := e_geoBroadcastRect, geoBroadcastArea := m_dummyArea } } // end geoDummyTemplates } // end geoMiscTemplates group geoTemplateFunctions { function f_adaptPayload_m(in octetstring p_finalPayload) return template (value) Payload { var template (value) Payload v_payload; if(PX_GN_UPPER_LAYER == e_any) { v_payload := { otherPayload := p_finalPayload}; return v_payload; } if(PX_GN_UPPER_LAYER == e_ipv6) { v_payload := { ipv6Packet := m_ipv6Packet(c_unspecified, c_allNodesMca, c_noNextHdr, m_octetstringPayload(p_finalPayload))}; return v_payload; } if(PX_GN_UPPER_LAYER == e_btpA) { v_payload := { btpPacket := m_btpA(3751 /*FIXME*/, 3751/*FIXME*/, { otherPayload := p_finalPayload })}; return v_payload; } if(PX_GN_UPPER_LAYER == e_btpB) { v_payload := { btpPacket := m_btpB(3751 /*FIXME*/, 0, { otherPayload := p_finalPayload })}; return v_payload; } return v_payload; } function f_adaptPayload_mw(in template (present) octetstring p_finalPayload) return template (present) Payload { var template (present) Payload v_payload; if(PX_GN_UPPER_LAYER == e_any) { v_payload := { otherPayload := p_finalPayload}; return v_payload; } if(PX_GN_UPPER_LAYER == e_ipv6) { v_payload := { ipv6Packet := mw_ipv6Packet(?, ?, ?, mw_octetstringPayload(p_finalPayload))}; return v_payload; } if(PX_GN_UPPER_LAYER == e_btpA) { v_payload := { btpPacket := mw_btpA(?, ?, { otherPayload := p_finalPayload } )}; return v_payload; } if(PX_GN_UPPER_LAYER == e_btpB) { v_payload := { btpPacket := mw_btpB(?, ?, { otherPayload := p_finalPayload })}; return v_payload; } return v_payload; } } // end geoTemplateFunctions } // end ItsGeoNetworking_Templates