LibItsGeoNetworking_Templates.ttcn 81.7 KB
Newer Older
berge's avatar
berge committed
/**
berge's avatar
berge committed
 *  @author     ETSI / STF405
 *  @version    $URL$
 *              $Id$
 *  @desc       GeoNetworking Templates
berge's avatar
berge committed
 *
 */
module LibItsGeoNetworking_Templates {
berge's avatar
berge committed
    
    // Libcommon
    import from LibCommon_BasicTypesAndValues all;
    import from LibCommon_DataStrings all;
berge's avatar
berge committed
    
    // LibIts
    import from LibIts_Interface all;
    import from LibItsGeoNetworking_TypesAndValues all;
berge's avatar
berge committed
    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;
berge's avatar
berge committed
    
    group geoNwPrimitivesTemplates {
berge's avatar
berge committed

        /**
         * @desc    Send template for GeoNetworking packet (GeonetworkingPort Primitive)
         * @param   p_geoNwMsg GeoNetworking packet to be sent
         */    
berge's avatar
berge committed
        template (value) GeoNetworkingReq m_geoNwReq_linkLayerBroadcast(
            template (value) GeoNetworkingPacket 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
berge's avatar
berge committed
        ) modifies m_geoNwReq_linkLayerBroadcast := {
            macDestinationAddress := p_llDestinationAdress
berge's avatar
berge committed

        /**
         * @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
            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  
berge's avatar
berge committed
             */
            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
berge's avatar
berge committed
             * @param   p_lifetime          Lifetime of the GeoUnicast message
             * @see     m_generateGeoUnicastMessage
berge's avatar
berge committed
             */
            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
berge's avatar
berge committed
             * @param   p_payload           Payload of the GeoUnicast message
             * @see     m_generateGeoUnicastMessage
berge's avatar
berge committed
             */
            template UtEvent m_generateGeoUnicastMessageWithPayload(
                GN_Address p_destinationGnAddr,
berge's avatar
berge committed
                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
berge's avatar
berge committed
             */
            template UtEvent m_generateGeoBroadcastMessage(
berge's avatar
berge committed
                GeoArea p_area
                utGnEvent := {
                    geoBroadcast := {
                        area := p_area,
berge's avatar
berge committed
                        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
berge's avatar
berge committed
             * @param   p_payload   Payload of the GeoBroadcast message
             * @see     m_generateGeoBroadcastMessage
berge's avatar
berge committed
             */
            template UtEvent m_generateGeoBroadcastMessageWithPayload(
berge's avatar
berge committed
                GeoArea p_area,
berge's avatar
berge committed
                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 
berge's avatar
berge committed
             */
            template UtEvent m_generateGeoAnycastMessage(
berge's avatar
berge committed
                GeoArea p_area
                utGnEvent := {
                    geoAnycast := {
                        area := p_area,
            /**
             * @desc    Request IUT to send a GeoAnycast message to a specific area with a payload
             * @param   p_area      Destination area of the message
berge's avatar
berge committed
             * @param   p_payload   Payload of the GeoAnycast message
             * @see     m_generateGeoAnycastMessage
berge's avatar
berge committed
             */
            template UtEvent m_generateGeoAnycastMessageWithPayload(
berge's avatar
berge committed
                GeoArea p_area,
berge's avatar
berge committed
                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
berge's avatar
berge committed
             */
            template UtEvent m_generateShbMessage := {
                utGnEvent := {
                    shb := {
                        payload := omit
                    }
            /**
             * @desc    Request IUT to send a SHB message with a payload
berge's avatar
berge committed
             * @param   p_payload   Payload of the SHB message
             * @see     m_generateShbMessage
berge's avatar
berge committed
             */
            template UtEvent m_generateShbMessageWithPayload(
berge's avatar
berge committed
                octetstring p_payload
            ) modifies m_generateShbMessage := {
                utGnEvent := {
                    shb := {
                        payload := { otherPayload := p_payload} // do not use f_adaptPayload_m here
berge's avatar
berge committed
            
            /**
             * @desc    Request IUT to send a TSB message
            template UtEvent m_generateTsbMessage := {
                utGnEvent := {
                    tsb := {
                        payload := omit
                    }
                }
            }
            
tepelmann's avatar
tepelmann committed
            /**
             * @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
        group taPrimitives {
            
berge's avatar
berge committed
            /**
             * @desc Testsystem will start beaconing for the given neighbor
             * @param p_beaconHeader The neighbor information
berge's avatar
berge committed
            template (value) AcGnPrimitive m_startBeaconing(
berge's avatar
berge committed
                template (value) BeaconHeader p_beaconHeader
            ) := {
                startBeaconing := {
                    beaconHeader := p_beaconHeader
                }
            }
            
berge's avatar
berge committed
            /**
             * @desc Testsystem will stop beaconing for the given neighbor
             * @param p_compName The neighbor
berge's avatar
berge committed
            template AcGnPrimitive m_stopBeaconing := {
                stopBeaconing:= {
                }
            }
            
            /**
             * @desc Testsystem will pass received to the TTCN-3
             * @param p_beaconHeader The neighbor information
             */
berge's avatar
berge committed
            template AcGnPrimitive m_startPassBeaconing(
berge's avatar
berge committed
                template (value) BeaconHeader p_beaconHeader
            ) := {
                startPassBeaconing := {
                    beaconHeader := p_beaconHeader
                }
            }
            
            /**
             * @desc Testsystem will stop passing beacon information to the TTCN-3
             */
berge's avatar
berge committed
            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
berge's avatar
berge committed
            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
             */
berge's avatar
berge committed
            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
berge's avatar
berge committed
            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
             */
berge's avatar
berge committed
            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
berge's avatar
berge committed
         */
        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
berge's avatar
berge committed
         * @param   p_payload   Payload
         * @see     m_geoNwPdu
berge's avatar
berge committed
         */
        template (value) GeoNetworkingPacket m_geoNwPduWithPayload(
            in template (value) Header p_header, 
            in template (value) Payload p_payload
berge's avatar
berge committed
        ) modifies m_geoNwPdu := {
            payload := p_payload
        /**
         * @desc    Receive template for GeoNetworking PDU
         * @param   p_header Header value of GeoNetworking message
berge's avatar
berge committed
         */
        template GeoNetworkingPacket mw_geoNwPdu(
            in template (present) Header p_header
        ) := {
            header := p_header,
            secHeader := *,
            payload := *          
        /**
         * @desc    Receive template for GeoNetworking PDU with any payload
berge's avatar
berge committed
         * @param   p_header Header value of GeoNetworking message
         * @see     mw_geoNwPdu
berge's avatar
berge committed
         */
        template GeoNetworkingPacket mw_geoNwPduAnyPayload(
            in template (present) Header p_header
        ) modifies mw_geoNwPdu := {
fischer's avatar
fischer committed
            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
berge's avatar
berge committed
         */
        template GeoNetworkingPacket mw_geoNwPduWithOctetstringPayload(
berge's avatar
berge committed
            in template (present) Header p_header, 
berge's avatar
berge committed
            in template (present) octetstring p_payload
berge's avatar
berge committed
        ) modifies mw_geoNwPdu := {
berge's avatar
berge committed
            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 
berge's avatar
berge committed
             */
            template (value) CommonHeader m_commonHeader (
berge's avatar
berge committed
                in template (value) NextHeader p_nextHeader,
                in template (value) HeaderTST p_headerTypeSubType,
berge's avatar
berge committed
                in template (value) TrafficClass p_trafficClass,
                in template (value) UInt8 p_hopLimit,
                in template (value) LongPosVector p_senderPosVec
berge's avatar
berge committed
                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,
berge's avatar
berge committed
                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
berge's avatar
berge committed
             */
            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,
berge's avatar
berge committed
                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
berge's avatar
berge committed
             */
fischer's avatar
fischer committed
            template CommonHeader mw_commonHeaderBeacon (
berge's avatar
berge committed
                in template (present) TrafficClass p_trafficClass,
                in template (present) UInt8 p_hopLimit,
fischer's avatar
fischer committed
                in template (present) LongPosVector p_senderLongPosVec
berge's avatar
berge committed
            ) := {
berge's avatar
berge committed
                version := c_geoNwProtocolVersion,
berge's avatar
berge committed
                headerTST := {
                    beaconHdr := {    
berge's avatar
berge committed
                        headerSubType := 0
                    }
                },
                reserved := c_uInt8Zero,
berge's avatar
berge committed
                flags := ?,
berge's avatar
berge committed
                plLength := 0,
berge's avatar
berge committed
                trafficClass := p_trafficClass,
                hopLimit := p_hopLimit,
                senderPosVector := p_senderLongPosVec
            }
            /**
             * @desc    Receive template for Common header with specific Hop limit
berge's avatar
berge committed
             * @param   p_senderLongPosVec  Long position vector of sender 
             * @param   p_nextHeader        Id of next header
             * @param   p_headerTypeSubType         Header's type and sub-type
berge's avatar
berge committed
             * @param   p_hopLimit          Maximum number of hops
             * @see     mw_commonHeader
berge's avatar
berge committed
             */
            template CommonHeader mw_commonHeaderWithHopLimit (
                in template (present) LongPosVector p_senderLongPosVec,
berge's avatar
berge committed
                in template (present) NextHeader p_nextHeader,
                in template (present) HeaderTST p_headerTypeSubType,
berge's avatar
berge committed
                in template (present) UInt8 p_hopLimit
            ) modifies mw_commonHeader := {
                hopLimit := p_hopLimit   
            }
            
             * @desc    Receive template for Common header with specific Traffic Class
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             */
            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
berge's avatar
berge committed
             */
            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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template TrafficClass mw_trafficClass(
                in template (present) Reliability p_reliability,
                in template (present) Latency p_latency
berge's avatar
berge committed
            ) := {
                reserved := c_uInt1Zero,
                relevance := c_uInt3Zero,
                reliability := p_reliability,
                latency := p_latency
            }
            
            /**
             * @desc    Receive template for any GN_Address
berge's avatar
berge committed
             */
fischer's avatar
fischer committed
            template GN_Address mw_gnAddressAny := {
                typeOfAddress := ?,
                stationType := ?,
                stationSubType := ?,
                stationCountryCode := ?,
                mid := ?
            }
berge's avatar
berge committed

            /**
             * @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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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 := ?
            }

fischer's avatar
fischer committed
            
            /**
             * @desc    Receive template for long position vector with specific GN_Address
             * @param   p_gnAddress GN_Address to be contained in the long position vector
berge's avatar
berge committed
             */
fischer's avatar
fischer committed
            template LongPosVector mw_longPosVectorAny(
berge's avatar
berge committed
                in template (present) GN_Address p_gnAddress
            ) := {
                gnAddr := p_gnAddress,
                timestamp := ?,
                latitude := ?,
                longitude := ?,
                speed := ?,
                heading := ?,
                altitude := ?,
                timeAccuracy := ?,
                posAccuracy := ?,
                speedAccuracy := ?,
                headingAccuracy := ?,
                altitudeAccuracy := ?
fischer's avatar
fischer committed
            }
             * @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
berge's avatar
berge committed
        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
berge's avatar
berge committed
             */
            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,
berge's avatar
berge committed
                        m_geoUnicastHeaderType,
                        m_trafficClass,
                        c_defaultHopLimit,
                        p_senderLongPosVec
                    ),
                    seqNumber := p_seqNumber,
                    lifetime := m_defaultLifetime,
                    reserved := c_uInt8Zero,
garciay's avatar
garciay committed
                    srcPosVector := p_sourceLongPosVec,
berge's avatar
berge committed
                    dstPosVector := p_destinationLongPosVec
berge's avatar
berge committed
            }    
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             * @param   p_seqNumber             Sequence number of GeoUnicast packet
             * @param   p_hopLimit              Maximum number of hops 
             * @see     m_geoUnicastHeader
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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
                    }
                }
berge's avatar
berge committed
            
            /**
             * @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
berge's avatar
berge committed
             */
            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,
berge's avatar
berge committed
                        ?,
                        mw_geoUnicastHeaderType
                    ),
                    seqNumber := p_seqNumber,
                    lifetime := ?,
berge's avatar
berge committed
                    reserved := ?,
berge's avatar
berge committed
                       srcPosVector := ?,
                    dstPosVector := p_destinationShortPosVec
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             * @param   p_srcLongPosVec             Long position vector of source
             * @see     mw_geoUnicastHeader
berge's avatar
berge committed
             */
            template Header mw_geoUnicastHeaderWithSourcePv(
berge's avatar
berge committed
                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
                }
            }
berge's avatar
berge committed
            
             * @desc    Receive template for GeoUnicast header with specific hop limit
berge's avatar
berge committed
             * @param   p_senderLongPosVec          Long position vector of sender
             * @param   p_destinationShortPosVec    Long position vector of destination
             * @param   p_seqNumber                 Sequence number of GeoUnicast packet
berge's avatar
berge committed
             * @param   p_hopLimit                  Maximum number of hops 
             * @see     mw_geoUnicastHeader
berge's avatar
berge committed
             */
            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 := {
tepelmann's avatar
tepelmann committed
                    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
berge's avatar
berge committed
             */
            template Header mw_geoUnicastHeaderWithCommonHeaderWithLifetime(
berge's avatar
berge committed
                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
                }
            } 
berge's avatar
berge committed
            
            /**
             * @desc    Send template for GeoUnicast header type
berge's avatar
berge committed
             */
            template (value) HeaderTST m_geoUnicastHeaderType := {
                geoUnicastHdr := {
berge's avatar
berge committed
                    headerType := e_geoUnicast,
fischer's avatar
fischer committed
                    headerSubType := c_uInt4Zero
            /**
             * @desc    Receive template for GeoUnicast header type
berge's avatar
berge committed
             */
            template HeaderTST mw_geoUnicastHeaderType := {
                geoUnicastHdr := {
berge's avatar
berge committed
                    headerType := e_geoUnicast,
fischer's avatar
fischer committed
                    headerSubType := c_uInt4Zero
berge's avatar
berge committed
            
        } // 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
berge's avatar
berge committed
             */
            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,
berge's avatar
berge committed
                        m_geoBroadcastHeaderType(p_broadcastArea.geoBroadcastSubType),
                        m_trafficClass,
                        c_defaultHopLimit,
                        p_senderLongPosVec
                    ),
                    seqNumber := p_seqNumber,
                    lifetime := m_defaultLifetime,
                    reserved := c_uInt8Zero,
                    srcPosVector := p_sourceLongPosVec,
berge's avatar
berge committed
                    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
                }
            }  
            
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             * @param   p_hopLimit          Maximum number of hops 
             * @see     m_geoBroadcastHeader
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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,
berge's avatar
berge committed
                in template (value) UInt8 p_hopLimit
            ) modifies m_geoBroadcastHeader := {
                geoBroadcastHeader := {
                    commonHeader := m_commonHeader(
                        PX_GN_UPPER_LAYER,
berge's avatar
berge committed
                        m_geoBroadcastHeaderType(p_broadcastArea.geoBroadcastSubType),
berge's avatar
berge committed
                        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
berge's avatar
berge committed
             */
            template Header mw_geoBroadcastHeader(
berge's avatar
berge committed
                in template (present) LongPosVector p_sourceLongPosVec,
berge's avatar
berge committed
                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,
berge's avatar
berge committed
                    srcPosVector := p_sourceLongPosVec,
                    geoAreaPosLatitude := ?,
                    geoAreaPosLongitude := ?,
                    distanceA := ?,
                    distanceB := ?,
                    angle := ?,
                    reserved2 := c_uInt24Zero
                }
            } 
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             * @param   p_broadcastArea     Destination GeoArea
             * @see     mw_geoBroadcastHeader
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template Header mw_geoBroadcastHeaderWithArea (
                in template (present) LongPosVector p_sourceLongPosVec,
berge's avatar
berge committed
                in template (present) LongPosVector p_senderLongPosVec,
berge's avatar
berge committed
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea
berge's avatar
berge committed
            ) modifies mw_geoBroadcastHeader := {
                geoBroadcastHeader := {
                    commonHeader := mw_commonHeader(
                        p_senderLongPosVec,
berge's avatar
berge committed
                        ?,
                        mw_geoBroadcastHeaderTypeWithSubType(p_broadcastArea.geoBroadcastSubType)
berge's avatar
berge committed
                    ),
berge's avatar
berge committed
                    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
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             * @param   p_hopLimit          Maximum number of hops 
             * @see     mw_geoBroadcastHeaderWithArea
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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,             
berge's avatar
berge committed
                in template (present) UInt8 p_hopLimit
            ) modifies mw_geoBroadcastHeaderWithArea := {
                geoBroadcastHeader := {
                    commonHeader := mw_commonHeaderWithHopLimit(
                        p_senderLongPosVec,
berge's avatar
berge committed
                        ?,
                        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
berge's avatar
berge committed
             */
            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
berge's avatar
berge committed
             */
            template (value) HeaderTST m_geoBroadcastHeaderType(
berge's avatar
berge committed
                in template (value) HeaderSubTypeGeoBroadcast p_headerSubType
            ) := {
                geoBroadcastHdr := {
berge's avatar
berge committed
                    headerType := e_geoBroadcast,
                    headerSubType := p_headerSubType
            /**
             * @desc    Receive template for GeoBroadcast header type 
berge's avatar
berge committed
             */
            template HeaderTST mw_geoBroadcastHeaderType := {
                geoBroadcastHdr := {
berge's avatar
berge committed
                    headerType := e_geoBroadcast,
                    headerSubType := ?
            /**
             * @desc    Receive template for GeoBroadcast header type with sub-type
berge's avatar
berge committed
             * @param   p_headerSubType Packet's subtype
             * @see     mw_geoBroadcastHeaderType
berge's avatar
berge committed
             */
            template HeaderTST mw_geoBroadcastHeaderTypeWithSubType(
berge's avatar
berge committed
                in template (present) HeaderSubTypeGeoBroadcast p_headerSubType
            ) modifies mw_geoBroadcastHeaderType := {
                geoBroadcastHdr := {
berge's avatar
berge committed
                    headerSubType := p_headerSubType
            /**
             * @desc    Default send template for Lifetime field
berge's avatar
berge committed
             */
            template (value) Lifetime m_defaultLifetime := {
berge's avatar
berge committed
                multiplier := c_defaultLifetime,
                ltBase := e_100s
berge's avatar
berge committed
            /**
             * @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
berge's avatar
berge committed
             */
            template (present) Lifetime mw_lifetime0 := {
                multiplier := 0,
                ltBase := ?
            }
                
        } // end geoBroadcastHeaderTemplates
berge's avatar
berge committed
        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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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
berge's avatar
berge committed
            ) := {
                geoAnycastHeader := {
                    commonHeader := m_commonHeader(
                        PX_GN_UPPER_LAYER,
berge's avatar
berge committed
                        m_geoAnycastHeaderType(p_anycastArea.geoAnycastSubType),
                        m_trafficClass,
                        c_defaultHopLimit,
                        p_senderLongPosVec
berge's avatar
berge committed
                    ),
                    seqNumber := p_seqNumber,
                    lifetime := m_defaultLifetime,
berge's avatar
berge committed
                    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
                }
            }  
            
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             * @param   p_hopLimit          Maximum number of hops 
             * @see     m_geoAnycastHeader
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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,
berge's avatar
berge committed
                in template (value) UInt8 p_hopLimit
            ) modifies m_geoAnycastHeader := {
                geoAnycastHeader := {
                    commonHeader := m_commonHeader(
                        PX_GN_UPPER_LAYER,
berge's avatar
berge committed
                        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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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,
berge's avatar
berge committed
                        ?,
                        mw_geoAnycastHeaderType                    
berge's avatar
berge committed
                    ),
                    seqNumber := p_seqNumber,
                    lifetime := ?,
                    reserved := c_uInt8Zero,
                    srcPosVector := p_sourceLongPosVec,
                    geoAreaPosLatitude := ?,
                    geoAreaPosLongitude := ?,
                    distanceA := ?,
                    distanceB := ?,
                    angle := ?,
                    reserved2 := c_uInt24Zero
                }
            } 
                       
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             * @param   p_anycastArea       Destination GeoArea
             * @see     mw_geoAnycastHeader 
             */
berge's avatar
berge committed
            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
berge's avatar
berge committed
            ) modifies mw_geoAnycastHeader := {
                geoAnycastHeader := {
                    commonHeader := mw_commonHeader(
                        p_senderLongPosVec,
berge's avatar
berge committed
                        ?,
                        mw_geoAnycastHeaderTypeWithSubType(p_anycastArea.geoAnycastSubType) 
berge's avatar
berge committed
                    ),
                    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
                }
            } 

berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             * @param   p_seqNumber         Sequence number of GeoAnycast packet
             * @param   p_anycastArea       Destination GeoArea
berge's avatar
berge committed
             * @param   p_hopLimit          Maximum number of hops 
             * @see     mw_geoAnycastHeaderWithArea
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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,             
berge's avatar
berge committed
                in template (present) UInt8 p_hopLimit
            ) modifies mw_geoAnycastHeaderWithArea := {
                geoAnycastHeader := {
                    commonHeader := mw_commonHeaderWithHopLimit(
                        p_senderLongPosVec,
berge's avatar
berge committed
                        ?,
                        mw_geoAnycastHeaderType,
                        p_hopLimit
                    )
                } 
            }
berge's avatar
berge committed
            
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template HeaderTST mw_geoAnycastHeaderType := {
                geoAnycastHdr := {
                    headerType := e_geoAnycast,
                    headerSubType := ?
                }
            }       
            
             * @desc    Receive template for GeoAnycast header type with sub-type
berge's avatar
berge committed
             * @param   p_headerSubType Packet's subtype
             * @see     mw_geoAnycastHeaderType 
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template HeaderTST mw_geoAnycastHeaderTypeWithSubType(
                in template (present) HeaderSubTypeGeoAnycast p_headerSubType
            ) modifies mw_geoAnycastHeaderType := {
                geoAnycastHdr := {
                    headerSubType := p_headerSubType
                }
            }       
               
        } // end geoAnycastHeaderTemplates

berge's avatar
berge committed
        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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template (value) Header m_lsRequestHeader(
berge's avatar
berge committed
                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      
berge's avatar
berge committed
            ) := {
                lsRequestHeader := {
berge's avatar
berge committed
                    commonHeader := m_commonHeader(
                        e_any,
berge's avatar
berge committed
                        m_lsRequestHeaderType,
                        m_trafficClass,
                        c_defaultHopLimit,
                        p_senderLongPosVec
berge's avatar
berge committed
                    ),    
                    seqNumber := p_seqNumber,
berge's avatar
berge committed
                    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
berge's avatar
berge committed
             * @param   p_mid           Searched GN_Address MID
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template Header mw_lsRequestHeader(
berge's avatar
berge committed
                in template (present) UInt16 p_seqNumber,
berge's avatar
berge committed
                in template (present) GN_Address.mid p_mid
berge's avatar
berge committed
            ) := {
                lsRequestHeader := {
berge's avatar
berge committed
                    commonHeader := mw_commonHeader(
berge's avatar
berge committed
                        e_any,
                        mw_lsRequestHeaderType
berge's avatar
berge committed
                    ),    
                    seqNumber := p_seqNumber,
berge's avatar
berge committed
                    lifetime := ?,
                    reserved := ?,
                    srcPosVector := ?,
berge's avatar
berge committed
             * @desc    Receive template for LS Request header with hop limit
             * @param   p_seqNumber     Sequence number of LS Request packet
berge's avatar
berge committed
             * @param   p_mid           Searched GN_Address MID
berge's avatar
berge committed
             * @param   p_hopLimit      Maximum number of hops 
             * @see     mw_lsRequestHeader
berge's avatar
berge committed
             */
            template Header mw_lsRequestHeader_withHopLimit(
tepelmann's avatar
tepelmann committed
                in template (present) UInt16 p_seqNumber,
                in template (present) GN_Address.mid p_mid,
tepelmann's avatar
tepelmann committed
                in template (present) UInt8 p_hopLimit
            ) modifies mw_lsRequestHeader := {
                lsRequestHeader := {
tepelmann's avatar
tepelmann committed
                  commonHeader := {
                      hopLimit := p_hopLimit
                  }
            /**
             * @desc    Send template for LS Request header type
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template (value) HeaderTST m_lsRequestHeaderType := {
                lsHdr := {
berge's avatar
berge committed
                    headerType := e_locationService,
                    headerSubType := e_lsRequest
            /**
             * @desc    Receive template for LS Request header type
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template HeaderTST mw_lsRequestHeaderType := {
                lsHdr := {
berge's avatar
berge committed
                    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
berge's avatar
berge committed
             */
            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,
                      p_senderLongPosVec
                  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
berge's avatar
berge committed
             */
            template Header mw_lsReplyHeaderAny := {
                commonHeader := mw_commonHeader(
                    ?,
                    e_any,
                    m_lsReplyHeaderType
                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  
berge's avatar
berge committed
             */
            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
berge's avatar
berge committed
             */
            template (value) HeaderTST m_lsReplyHeaderType := {
                lsHdr := {
                  headerType := e_locationService,
                  headerSubType := e_lsReply
                }
            }      
            
berge's avatar
berge committed
        } // end lsRequestHeaderTemplates 
                    
berge's avatar
berge committed
        group beaconHeaderTemplates {
            
            /**
             * @desc    Send template for Beacon header
             * @param   p_senderLongPosVec  Long position vector of sender 
berge's avatar
berge committed
             */
            template (value) Header m_beaconHeader(
                in template (value) LongPosVector p_senderLongPosVec
berge's avatar
berge committed
            ) := {
                beaconHeader := {
berge's avatar
berge committed
                    commonHeader := m_commonHeader(
berge's avatar
berge committed
                        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 
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template Header mw_beaconHeader(
fischer's avatar
fischer committed
            in template (present) TrafficClass p_trafficClass,
            in template (present) UInt8 p_hopLimit,
            in template (present) LongPosVector p_senderLongPosVec
berge's avatar
berge committed
            ) := {
                beaconHeader := {
berge's avatar
berge committed
                       commonHeader := mw_commonHeaderBeacon(
                        p_trafficClass,
                        p_hopLimit,
                        p_senderLongPosVec
            /**
             * @desc    Send template for Beacon header type
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template (value) HeaderTST m_beaconHeaderType := {
                beaconHdr := {
berge's avatar
berge committed
                    headerType := e_beacon,
fischer's avatar
fischer committed
                    headerSubType := c_uInt4Zero
            /**
             * @desc    Receive template for Beacon header type
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template HeaderTST mw_beaconHeaderType := {
                beaconHdr := {
berge's avatar
berge committed
                    headerType := e_beacon,
fischer's avatar
fischer committed
                    headerSubType := ?
berge's avatar
berge committed
            
        } // end beaconHeaderTemplates                    
berge's avatar
berge committed
             * @desc    Send template for SHB header
             * @param   p_senderLongPosVec  Long position vector of sender
berge's avatar
berge committed
             */
                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
berge's avatar
berge committed
             */
            template Header mw_shbHeader := {
fischer's avatar
fischer committed
                    commonHeader := mw_commonHeaderWithHopLimit(
                        ?, // SE PV
                        ?, // NH
                        m_shbHeaderType, // HT + HST
                        1 // HL
            /**
             * @desc    Send template for SHB header type
berge's avatar
berge committed
             */
            template (value) HeaderTST m_shbHeaderType := {
                tsbHdr := {
                  headerType := e_topologicallyScopedBroadcast,
                  headerSubType := e_singleHop
                }
            }      
            
        } // end shbHeaderTemplates
        
tepelmann's avatar
tepelmann committed
        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
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            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, 
tepelmann's avatar
tepelmann committed
                        m_trafficClass,
                        c_defaultHopLimit, 
                        p_senderLongPosVec
tepelmann's avatar
tepelmann committed
                    ),
                    seqNumber := p_seqNumber,
                    lifetime := m_defaultLifetime,
tepelmann's avatar
tepelmann committed
                    reserved := c_uInt8Zero,
                    srcPosVector := p_srcPosVector
                }
            }
            
berge's avatar
berge committed
             * @desc    Send template for TSB header with hop limit
             * @param   p_senderLongPosVec  Long position vector of sender
berge's avatar
berge committed
             * @param   p_seqNumber         Sequence number of TSB packet
             * @param   p_srcPosVector      Long position vector of source
             * @param   p_hopLimit          Maximum number of hops
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            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
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template Header mw_tsbHeader(
                in template (present) UInt16 p_seqNumber, 
fischer's avatar
fischer committed
                in template (present) LongPosVector p_sourceLongPosVec
tepelmann's avatar
tepelmann committed
            ) := {
                tsbHeader := {
                    commonHeader := mw_commonHeader(
berge's avatar
berge committed
                        ?,
                        m_tsbHeaderType
tepelmann's avatar
tepelmann committed
                    ),
                    seqNumber := p_seqNumber,
                    lifetime := ?,
                    reserved := ?,
fischer's avatar
fischer committed
                    srcPosVector := p_sourceLongPosVec
                }
            }
            
            /**
             * @desc    Receive template for TSB header with sender position vector
             * @param   p_senderLongPosVec  Long position vector of sender
berge's avatar
berge committed
             * @param   p_seqNumber         Sequence number of TSB packet
             * @param   p_sourceLongPosVec  Long position vector of source
berge's avatar
berge committed
             */
fischer's avatar
fischer committed
            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 := {
fischer's avatar
fischer committed
                tsbHeader := {
                    commonHeader := mw_commonHeader(
berge's avatar
berge committed
                        p_senderLongPosVec,
                        m_tsbHeaderType
berge's avatar
berge committed
             * @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
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template Header mw_tsbHeaderWithHopLimit(
                in template (present) UInt16 p_seqNumber, 
berge's avatar
berge committed
                in template (present) LongPosVector p_sourceLongPosVec,
tepelmann's avatar
tepelmann committed
                in template (present) UInt8 p_hopLimit 
            ) modifies mw_tsbHeader := {
                tsbHeader := {
                    commonHeader := {
                      hopLimit := p_hopLimit
                    }
                }
            }
            
            /**
             * @desc    Send template for TSB header type
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (value) HeaderTST m_tsbHeaderType := {
                tsbHdr := {
                  headerType := e_topologicallyScopedBroadcast,
                  headerSubType := e_multiHop
                }
            }      
            
        } // end tsbHeaderTemplates
        
    } // end geoNwHeadersTemplates
berge's avatar
berge committed
    
berge's avatar
berge committed
    group geoPayloadTemplates {
        
        /**
         * @desc    Receive template for misc. payload
         * @param   p_payload   Payload
berge's avatar
berge committed
         */
        template Payload mw_otherPayload(
            in template (present) octetstring p_payload
        ) := {
berge's avatar
berge committed
            otherPayload := p_payload
        }
        
    } // end geoPayloadTemplates
    
berge's avatar
berge committed
    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
        }
berge's avatar
berge committed
        group geoDummyTemplates {
            
            /**
             * @desc    Dummy template for GN_Address 
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template (value) GN_Address m_dummyGnAddr := {
                typeOfAddress := e_manual,
                stationType := {
                    vehicleStation := {
                        stationType := e_vehicleStation,
                        vsKind := e_car   
                    }
                },
                stationSubType := e_private,
                stationCountryCode := c_uInt10Zero,
            /**
             * @desc    Dummy template for long position vector
berge's avatar
berge committed
             */
berge's avatar
berge committed
            template (value) LongPosVector m_dummyLongPosVector := {
berge's avatar
berge committed
                gnAddr := m_dummyGnAddr,
                timestamp := c_uInt32Zero,
                latitude := c_uInt32Zero,
berge's avatar
berge committed
                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
berge's avatar
berge committed
             */
berge's avatar
berge committed
            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
berge's avatar
berge committed
             */
            template (value) GeoBroadcastArea m_dummyGeoBroadcastArea := {
berge's avatar
berge committed
                geoBroadcastSubType := e_geoBroadcastRect,
                geoBroadcastArea := m_dummyArea
            }
            
berge's avatar
berge committed
        } // end geoDummyTemplates
        
    } // end geoMiscTemplates
    
berge's avatar
berge committed
    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 })};
berge's avatar
berge committed
               return v_payload;    
            }
            
            if(PX_GN_UPPER_LAYER == e_btpB) {
               v_payload := { btpPacket := m_btpB(3751 /*FIXME*/, 0, { otherPayload := p_finalPayload })};
berge's avatar
berge committed
               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 } )};
berge's avatar
berge committed
               return v_payload;    
            }
            
            if(PX_GN_UPPER_LAYER == e_btpB) {
               v_payload := { btpPacket := mw_btpB(?, ?, { otherPayload := p_finalPayload })};
berge's avatar
berge committed
               return v_payload;    
            }
            
            return v_payload;
        }   
                
    } // end geoTemplateFunctions
    
berge's avatar
berge committed
} // end ItsGeoNetworking_Templates