Skip to content
LibItsGeoNetworking_Templates.ttcn 83.4 KiB
Newer Older
tepelmann's avatar
tepelmann committed
             * @desc    Send template for GeoNetworking TSB Packet
             * @param   p_seqNumber         Sequence number of TSB packet
             * @param   p_sourceLongPosVec  Long position vector of source
             */
            template (value) GnNonSecuredPacket m_geoNwTsbPacket(
                in template (value) UInt16 p_seqNumber,
                in template (value) LongPosVector p_sourceLongPosVec
            ) := {
                commonHeader := m_commonHeader(
                    PX_GN_UPPER_LAYER,
                    m_tsbHeaderType,
                    m_trafficClass,
                    c_defaultHopLimit
                ),
                extendedHeader := m_tsbHeader(
                    p_seqNumber,
                    p_sourceLongPosVec
                ),
                payload :=  f_adaptPayload_m(char2oct("DEFAULT_PAYLOAD"))
            }
            
            /**
             * @desc    Receive template for GeoNetworking TSB Packet
             * @param   p_seqNumber         Sequence number of TSB packet (Default: ?)
             * @param   p_sourceLongPosVec  Long position vector of source (Default: ?)
             */
            template (present) GnNonSecuredPacket mw_geoNwTsbPacket(
                in template (present) UInt16 p_seqNumber := ?,
                in template (present) LongPosVector p_sourceLongPosVec := ?
            ) := {
                commonHeader := mw_commonHeader(
                    PX_GN_UPPER_LAYER,
                    m_tsbHeaderType
                ),
                extendedHeader := mw_tsbHeader(p_seqNumber, p_sourceLongPosVec),
                payload := ?
            }
            
            /**
             * @desc    Receive template for GeoNetworking TSB Packet
             * @param   p_seqNumber         Sequence number of TSB packet (Default: ?)
             * @param   p_sourceLongPosVec  Long position vector of source (Default: ?)
             * @param   p_nextHeader        Id of next header
             */
            template (present) GnNonSecuredPacket mw_geoNwTsbPacketWithNextHeader(
                in template (present) UInt16 p_seqNumber := ?,
                in template (present) LongPosVector p_sourceLongPosVec := ?,
                in template (value) NextHeader p_nextHeader
            ) modifies mw_geoNwTsbPacket := {
                commonHeader := {
                    nextHeader := p_nextHeader
                }
            }
            
        } // end group geoNwPacketTsbTemplates
        
    } // end group geoNwPacketTemplates
    
    group geoNwHeadersTemplates {
        
tepelmann's avatar
tepelmann committed
        group geoNwBasicHeaderTemplates {
            
            /**
             * @desc    Send template for Basic header 
             * 
             * @param p_lifeTime    Lifetime of GeoNetworking message
             * @param p_hopLimit    Router Hop limit of GeoNetworking message
             */
            template (value) BasicHeader m_basicHeader(
                in template (value) Lifetime p_lifeTime := m_defaultLifetime,
                in template (value) UInt8 p_hopLimit := c_defaultHopLimit
            ) := {
                version := c_geoNwProtocolVersion2,
                nextHeader := e_any,
                reserved := 0,
                lifeTime := p_lifeTime,
                routerHopLimit := p_hopLimit
            }
            
            /**
             * @desc    Receive template for Basic header 
             * 
             * @param p_lifeTime    Lifetime of GeoNetworking message
             * @param p_hopLimit    Router Hop limit of GeoNetworking message
             */
            template (present) BasicHeader mw_basicHeader(
                in template (present) Lifetime p_lifeTime := ?,
                in template (present) UInt8 p_hopLimit := ?
            ) := {
                version := c_geoNwProtocolVersion2,
                nextHeader := ?,
                reserved := ?,
                lifeTime := p_lifeTime,
                routerHopLimit := p_hopLimit
            }
            
            /**
             * @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 group geoNwBasicHeaderTemplates
tepelmann's avatar
tepelmann committed
        group geoNwCommonHeaderTemplates {
            
            /**
             * @desc    Send template for Common header 
             * @param   p_nextHeader    Id of next header
             * @param   p_trafficClass  Packet's traffic class
tepelmann's avatar
tepelmann committed
             * @param   p_headerTypeSubType     Header's type and sub-type
             * @param   p_hopLimit      Maximum number of hops
             * @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,
tepelmann's avatar
tepelmann committed
                in template (value) UInt8 p_hopLimit
            ) := {
                nextHeader := p_nextHeader,
                reserved := c_uInt8Zero,
tepelmann's avatar
tepelmann committed
                headerTST := p_headerTypeSubType,
                trafficClass := p_trafficClass,
                flags := c_8ZeroBits,
                plLength := 0, // will be computed by Codec
tepelmann's avatar
tepelmann committed
                maxHopLimit := p_hopLimit,
                reserved2 := 0
            /**
             * @desc    Receive template for Common header
             * @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) NextHeader p_nextHeader,
                in template (present) HeaderTST p_headerTypeSubType
            ) := {
                nextHeader := p_nextHeader,
                reserved := ?,
tepelmann's avatar
tepelmann committed
                headerTST := p_headerTypeSubType,
                trafficClass := ?,
berge's avatar
berge committed
                flags := ?,
tepelmann's avatar
tepelmann committed
                maxHopLimit := ?,
                reserved2 := ?
            /**
             * @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
tepelmann's avatar
tepelmann committed
             * @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 (
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 := {
tepelmann's avatar
tepelmann committed
                maxHopLimit := 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) 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
             */
tepelmann's avatar
tepelmann committed
            template (value) TrafficClass m_trafficClass := 0;
            /**
             * @desc    Receive template for traffic class
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template TrafficClass mw_trafficClass := ?;
            /**
             * @desc    Receive template for any GN_Address
berge's avatar
berge committed
             */
fischer's avatar
fischer committed
            template GN_Address mw_gnAddressAny := {
                typeOfAddress := ?,
                stationType := ?,
                stationCountryCode := ?,
                mid := ?
            }
            /**
             * @desc    Receive template for GN_Address
             * @param   p_stationType           Station's 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) UInt10 p_stationCountryCode
            ) := {
                typeOfAddress := ?,
                stationType := p_stationType,
                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 := ?,
tepelmann's avatar
tepelmann committed
                pai := ?,
                speed := ?,
tepelmann's avatar
tepelmann committed
                heading := ?
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,
tepelmann's avatar
tepelmann committed
                pai := ?,
                speed := p_longPosVector.speed,
tepelmann's avatar
tepelmann committed
                heading := p_longPosVector.heading
            /**
             * @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),
tepelmann's avatar
tepelmann committed
                    speed := (valueof(p_longPosVector.speed)-PX_POS_DELTA .. valueof(p_longPosVector.speed)+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)
            
            /**
             * @desc    Receive template for short position vector without position check 
             * @param   p_shortPosVector The base short position vector
             */
            template ShortPosVector mw_shortPosVectorPosition_anyPos(
                in template (value) ShortPosVector p_shortPosVector
            ) modifies mw_shortPosVectorPosition := {
                    latitude := ?,
                    longitude := ?
            }
        } // 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_seqNumber             Sequence number of GeoUnicast packet
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (value) ExtendedHeader m_geoUnicastHeader(
berge's avatar
berge committed
                in template (value) LongPosVector p_sourceLongPosVec,
                in template (value) ShortPosVector p_destinationLongPosVec,
                in template (value) UInt16 p_seqNumber
            ) := {
                geoUnicastHeader := {
                    seqNumber := p_seqNumber,
                    reserved := c_uInt8Zero,
garciay's avatar
garciay committed
                    srcPosVector := p_sourceLongPosVec,
berge's avatar
berge committed
                    dstPosVector := p_destinationLongPosVec
tepelmann's avatar
tepelmann committed
            }
            /**
             * @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
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_geoUnicastHeader(
berge's avatar
berge committed
                in template (present) ShortPosVector p_destinationShortPosVec,
                in template (present) UInt16 p_seqNumber
            ) := {
                geoUnicastHeader := {
                    seqNumber := p_seqNumber,
berge's avatar
berge committed
                    reserved := ?,
                    srcPosVector := ?,
berge's avatar
berge committed
                    dstPosVector := p_destinationShortPosVec
berge's avatar
berge committed
            }
tepelmann's avatar
tepelmann committed
             * @desc    Receive template for GeoUnicast header with source long position vector
berge's avatar
berge committed
             * @param   p_destinationShortPosVec    Long position vector of destination
             * @param   p_seqNumber                 Sequence number of GeoUnicast packet
tepelmann's avatar
tepelmann committed
             * @param   p_srcLongPosVec             Long position vector of source
             * @see     mw_geoUnicastHeader
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_geoUnicastHeaderWithSourcePv(
berge's avatar
berge committed
                in template (present) ShortPosVector p_destinationShortPosVec,
                in template (present) UInt16 p_seqNumber,
tepelmann's avatar
tepelmann committed
                in template (present) LongPosVector p_srcLongPosVec
berge's avatar
berge committed
            ) modifies mw_geoUnicastHeader := {
                geoUnicastHeader := {
tepelmann's avatar
tepelmann committed
                    srcPosVector := p_srcLongPosVec
berge's avatar
berge committed
                }
tepelmann's avatar
tepelmann 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
tepelmann's avatar
tepelmann committed
            }
            /**
             * @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
tepelmann's avatar
tepelmann committed
            }
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_seqNumber         Sequence number of GeoBroadcast packet
             * @param   p_broadcastArea     Destination GeoArea
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (value) ExtendedHeader m_geoBroadcastHeader(
berge's avatar
berge committed
                in template (value) LongPosVector p_sourceLongPosVec,
                in template (value) UInt16 p_seqNumber,
                in template (value) GeoBroadcastArea p_broadcastArea
            ) := {
                geoBroadcastHeader := {
                    seqNumber := p_seqNumber,
                    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,
            /**
             * @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
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_geoBroadcastHeader(
berge's avatar
berge committed
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber
            ) := {
                geoBroadcastHeader := {
                    seqNumber := p_seqNumber,
                    reserved := ?,
                    srcPosVector := p_sourceLongPosVec,
                    geoAreaPosLatitude := ?,
                    geoAreaPosLongitude := ?,
                    distanceA := ?,
                    distanceB := ?,
                    angle := ?,
                    reserved2 := ?
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
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_geoBroadcastHeaderWithArea (
berge's avatar
berge committed
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea
berge's avatar
berge committed
            ) modifies mw_geoBroadcastHeader := {
                geoBroadcastHeader := {
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
                }
berge's avatar
berge committed
            }
            /**
             * @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 := ?
tepelmann's avatar
tepelmann committed
            }
            /**
             * @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
        } // 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_seqNumber         Sequence number of GeoAnycast packet
             * @param   p_anycastArea       Destination GeoArea
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (value) ExtendedHeader m_geoAnycastHeader(
berge's avatar
berge committed
                in template (value) LongPosVector p_sourceLongPosVec,
                in template (value) UInt16 p_seqNumber,
                in template (value) GeoAnycastArea p_anycastArea
berge's avatar
berge committed
            ) := {
                geoAnycastHeader := {
                    seqNumber := p_seqNumber,
                    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    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
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_geoAnycastHeader(
berge's avatar
berge committed
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber
            ) := {
                geoAnycastHeader := {
                    seqNumber := p_seqNumber,
                    reserved := ?,
berge's avatar
berge committed
                    srcPosVector := p_sourceLongPosVec,
                    geoAreaPosLatitude := ?,
                    geoAreaPosLongitude := ?,
                    distanceA := ?,
                    distanceB := ?,
                    angle := ?,
                    reserved2 := ?
berge's avatar
berge committed
                }
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 
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_geoAnycastHeaderWithArea (
berge's avatar
berge committed
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoAnycastArea p_anycastArea
berge's avatar
berge committed
            ) modifies mw_geoAnycastHeader := {
                geoAnycastHeader := {
                    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    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 := ?
                }
tepelmann's avatar
tepelmann committed
            }
             * @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
                }
berge's avatar
berge committed
        } // 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_seqNumber         Sequence number of LS Request packet
             * @param   p_gnAddress         Searched GN_Address
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (value) ExtendedHeader m_lsRequestHeader(
berge's avatar
berge committed
                in template (value) LongPosVector p_sourceLongPosVec,
                in template (value) UInt16 p_seqNumber,
tepelmann's avatar
tepelmann committed
                in template (value) GN_Address p_gnAddress
berge's avatar
berge committed
            ) := {
                lsRequestHeader := {
tepelmann's avatar
tepelmann committed
                    seqNumber       := p_seqNumber,
                    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
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader 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 := {
                    seqNumber := p_seqNumber,
berge's avatar
berge committed
                    reserved := ?,
                    srcPosVector := ?,
            /**
             * @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
berge's avatar
berge committed
                }
tepelmann's avatar
tepelmann committed
            }
        } // 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_seqNumber             Sequence number of LS Reply packet
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (value) ExtendedHeader m_lsReplyHeader(
              in template (value) LongPosVector p_sourceLongPosVec,
              in template (value) ShortPosVector p_destinationLongPosVec,
              in template (value) UInt16 p_seqNumber
            ) := {
                lsReplyHeader := {
                  seqNumber := p_seqNumber,
                  reserved := c_uInt8Zero,
                  srcPosVector := p_sourceLongPosVec,
                  dstPosVector := p_destinationLongPosVec
                }
            }
            
            /**
             * @desc    Receive template for any LS Reply header 
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_lsReplyHeaderAny := {
                reserved := ?,
                srcPosVector := ?,
                dstPosVector := ?
            /**
             * @desc    Receive template for LS Reply header 
             * @param   p_sourceLongPosVec      Long position vector of source
             * @param   p_destinationLongPosVec Short position vector of destination
             * @see     mw_lsReplyHeaderAny  
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_lsReplyHeader(
                in template (present) LongPosVector p_sourceLongPosVec, 
                in template (present) ShortPosVector p_destinationLongPosVec)
            modifies mw_lsReplyHeaderAny := {
                lsReplyHeader := {
                    srcPosVector := p_sourceLongPosVec,
                    dstPosVector := p_destinationLongPosVec
                }
berge's avatar
berge committed
            }
            /**
             * @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
                }
tepelmann's avatar
tepelmann committed
            }
berge's avatar
berge committed
        } // end lsRequestHeaderTemplates 
berge's avatar
berge committed
        group beaconHeaderTemplates {
            
            /**
             * @desc    Send template for Beacon header
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec  Long position vector of source 
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (value) ExtendedHeader m_beaconHeader(
                in template (value) LongPosVector p_sourceLongPosVec
berge's avatar
berge committed
            ) := {
                beaconHeader := {
tepelmann's avatar
tepelmann committed
                    srcPosVector := p_sourceLongPosVec
            /**
             * @desc    Receive template for Beacon header
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec  Long position vector of source 
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template ExtendedHeader mw_beaconHeader(
                in template (present) LongPosVector p_sourceLongPosVec
berge's avatar
berge committed
            ) := {
                beaconHeader := {
tepelmann's avatar
tepelmann committed
                    srcPosVector := p_sourceLongPosVec
            /**
             * @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 := ?
tepelmann's avatar
tepelmann committed
        } // end beaconHeaderTemplates
        
berge's avatar
berge committed
             * @desc    Send template for SHB header
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec  Long position vector of sender
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (value) ExtendedHeader m_shbHeader(
                in template (value) LongPosVector p_sourceLongPosVec
tepelmann's avatar
tepelmann committed
                    srcPosVector := p_sourceLongPosVec,
                    reserved := 0
            /**
             * @desc    Receive template for SHB header
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec  Long position vector of sender
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (present) ExtendedHeader mw_shbHeader(
                in template (present) LongPosVector p_sourceLongPosVec
            ) := {
tepelmann's avatar
tepelmann committed
                    srcPosVector:= p_sourceLongPosVec,
                    reserved := ?
            /**
             * @desc    Send template for SHB header type
berge's avatar
berge committed
             */
            template (value) HeaderTST m_shbHeaderType := {
                tsbHdr := {
                  headerType := e_topologicallyScopedBroadcast,
                  headerSubType := e_singleHop
                }
tepelmann's avatar
tepelmann committed
            }
tepelmann's avatar
tepelmann committed
        group tsbHeaderTemplates {
            
            /**
             * @desc    Send template for TSB header
             * @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 ExtendedHeader m_tsbHeader(
tepelmann's avatar
tepelmann committed
                in template (value) UInt16 p_seqNumber,
                in template (value) LongPosVector p_srcPosVector
            ) := {
                tsbHeader := {
                    seqNumber := p_seqNumber,
                    reserved := c_uInt8Zero,
                    srcPosVector := p_srcPosVector
                }
            }
            
            /**
             * @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 (present) ExtendedHeader mw_tsbHeader(
tepelmann's avatar
tepelmann committed
                in template (present) UInt16 p_seqNumber, 
fischer's avatar
fischer committed
                in template (present) LongPosVector p_sourceLongPosVec
tepelmann's avatar
tepelmann committed
            ) := {
                tsbHeader := {
                    seqNumber := p_seqNumber,
                    reserved := ?,
fischer's avatar
fischer committed
                    srcPosVector := p_sourceLongPosVec
                }
            }
            
tepelmann's avatar
tepelmann committed
             * @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
tepelmann's avatar
tepelmann committed
             * @desc    Receive template for TSB header type
berge's avatar
berge committed
             */
tepelmann's avatar
tepelmann committed
            template (present) HeaderTST mw_tsbHeaderType := {
tepelmann's avatar
tepelmann committed
                tsbHdr := {
                  headerType := e_topologicallyScopedBroadcast,
                  headerSubType := e_multiHop
                }
tepelmann's avatar
tepelmann committed
            }
tepelmann's avatar
tepelmann committed
            
        } // end tsbHeaderTemplates
        
    } // end geoNwHeadersTemplates
berge's avatar
berge committed
    
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 := ?,
            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,
tepelmann's avatar
tepelmann committed
                stationType := e_passengerCar,
                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,
tepelmann's avatar
tepelmann committed
                pai := c_uInt1Zero,
berge's avatar
berge committed
                speed := c_uInt16Zero,
tepelmann's avatar
tepelmann committed
                heading := c_uInt16Zero
            /**
             * @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,
tepelmann's avatar
tepelmann committed
                angle := c_uInt16Zero
berge's avatar
berge committed
            }
            /**
             * @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 {
berge's avatar
berge committed
        function f_adaptPayload_m(in octetstring p_finalPayload) return template (value) Payload {
tepelmann's avatar
tepelmann committed
            var template (value) Payload v_payload;
            
            if(PX_GN_UPPER_LAYER == e_any) {
               v_payload := { decodedPayload := omit, rawPayload := p_finalPayload};
               return v_payload;	
            }
            
            if(PX_GN_UPPER_LAYER == e_ipv6) {
               v_payload := { decodedPayload := { ipv6Packet := m_ipv6Packet(c_unspecified, c_allNodesMca, c_noNextHdr, m_octetstringPayload(p_finalPayload))}, rawPayload := ''O};
tepelmann's avatar
tepelmann committed
               return v_payload;
berge's avatar
berge committed
            }
            
            if(PX_GN_UPPER_LAYER == e_btpA) {
               v_payload := { decodedPayload := { btpPacket := m_btpA({ decodedPayload := omit, rawPayload := p_finalPayload })}, rawPayload := ''O};
tepelmann's avatar
tepelmann committed
               return v_payload;
berge's avatar
berge committed
            }
            
            if(PX_GN_UPPER_LAYER == e_btpB) {
               v_payload := { decodedPayload := { btpPacket := m_btpB({ decodedPayload := omit, rawPayload := p_finalPayload })}, rawPayload := ''O};
tepelmann's avatar
tepelmann committed
               return v_payload;
berge's avatar
berge committed
            }
            
            return v_payload;
berge's avatar
berge committed
        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 := { decodedPayload := *, rawPayload := p_finalPayload};
tepelmann's avatar
tepelmann committed
               return v_payload;
berge's avatar
berge committed
            }
            
            if(PX_GN_UPPER_LAYER == e_ipv6) {
               v_payload := { decodedPayload := { ipv6Packet := mw_ipv6Packet(?, ?, ?, mw_octetstringPayload(p_finalPayload))}, rawPayload := ''O};
tepelmann's avatar
tepelmann committed
               return v_payload;
berge's avatar
berge committed
            }
            
            if(PX_GN_UPPER_LAYER == e_btpA) {
               v_payload := { decodedPayload := { btpPacket := mw_btpA(?, ?, { decodedPayload := *, rawPayload := p_finalPayload } )}, rawPayload := ''O};
tepelmann's avatar
tepelmann committed
               return v_payload;
berge's avatar
berge committed
            }
            
            if(PX_GN_UPPER_LAYER == e_btpB) {
               v_payload := { decodedPayload := { btpPacket := mw_btpB(?, ?, { decodedPayload := *, rawPayload := p_finalPayload })}, rawPayload := ''O};
tepelmann's avatar
tepelmann committed
               return v_payload;
berge's avatar
berge committed
            }
            
            return v_payload;
berge's avatar
berge committed
    } // end geoTemplateFunctions
    
berge's avatar
berge committed
} // end ItsGeoNetworking_Templates