LibItsGeoNetworking_Templates.ttcn 109 KB
Newer Older
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec      Long position vector of source
tepelmann's avatar
tepelmann committed
             * @param   p_seqNumber             Sequence number of GeoBroadcast packet
             * @param   p_nextHeader            Id of next header
             */
            template (present) GnNonSecuredPacket mw_geoNwBroadcastPacketWithNextHeader(
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) NextHeader p_nextHeader
            ) modifies mw_geoNwBroadcastPacket := {
                commonHeader := mw_commonHeader(
                    p_nextHeader,
                    mw_geoBroadcastHeaderType
                )
            }
            
tepelmann's avatar
tepelmann committed
            /**
             * @desc    Receive template for GeoNetworking Broadcast Packet
             * @param   p_sourceLongPosVec      Long position vector of source
             * @param   p_seqNumber             Sequence number of GeoBroadcast packet
             * @param   p_nextHeader            Id of next header
             * @param   p_payload               payload
             */
            template (present) GnNonSecuredPacket mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) NextHeader p_nextHeader,
                in template (present) GnRawPayload p_payload
tepelmann's avatar
tepelmann committed
            ) modifies mw_geoNwBroadcastPacketWithNextHeader := {
                payload := p_payload
            }
            
tepelmann's avatar
tepelmann committed
            /**
             * @desc    Receive template for GeoNetworking Broadcast Packet
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec      Long position vector of source
tepelmann's avatar
tepelmann committed
             * @param   p_seqNumber             Sequence number of GeoBroadcast packet
             * @param   p_broadcastArea         Destination GeoArea
             */
            template (present) GnNonSecuredPacket mw_geoNwBroadcastPacketWithArea(
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea
            ) modifies mw_geoNwBroadcastPacket := {
                commonHeader := mw_commonHeader(
                    PX_GN_UPPER_LAYER,
                    mw_geoBroadcastHeaderTypeWithSubType(p_broadcastArea.geoBroadcastSubType)
                ),
                extendedHeader := mw_geoBroadcastHeaderWithArea(
                    p_sourceLongPosVec,
                    p_seqNumber,
                    p_broadcastArea
                )
            }
            
            /**
             * @desc    Receive template for GeoNetworking Broadcast Packet
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec      Long position vector of source
             * @param   p_seqNumber             Sequence number of GeoBroadcast packet
             * @param   p_broadcastArea         Destination GeoArea
             * @param   p_maxHopLimit           Maximum number of hops (Default := ?)
             */
            template (present) GnNonSecuredPacket mw_geoNwBroadcastPacketWithAreaAndHl(
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea,
                in template (present) UInt8 p_maxHopLimit := ?
            ) modifies mw_geoNwBroadcastPacketWithArea := {
                commonHeader := mw_commonHeaderWithHopLimit(
                    PX_GN_UPPER_LAYER,
                    mw_geoBroadcastHeaderTypeWithSubType(p_broadcastArea.geoBroadcastSubType),
                    p_maxHopLimit
                )
            }
            
            /**
             * @desc    Receive template for GeoNetworking Broadcast Packet
             * @param   p_sourceLongPosVec      Long position vector of source
             * @param   p_seqNumber             Sequence number of GeoBroadcast packet (Default: ?)
             * @param   p_hopLimit              Maximum number of hops (Default: ?)
             * @param   p_flags                 Flags in the common header (Default: ?)
             */
            template (present) GnNonSecuredPacket mw_geoNwBroadcastPacketWithHlAndFlags(
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber := ?,
                in template (present) UInt8 p_hopLimit := ?,
                in template (present) Bit8 p_flags := ?
            ) modifies mw_geoNwBroadcastPacket := {
                commonHeader := mw_commonHeaderWithHopLimitAndFlags(
                    PX_GN_UPPER_LAYER,
                    mw_geoBroadcastHeaderType,
                    p_hopLimit,
                    p_flags
                )
            }
            
tepelmann's avatar
tepelmann committed
            /**
             * @desc    Receive template for GeoNetworking Broadcast Packet
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec      Long position vector of source
tepelmann's avatar
tepelmann committed
             * @param   p_seqNumber             Sequence number of GeoBroadcast packet
             * @param   p_broadcastArea         Destination GeoArea
             */
            template (present) GnNonSecuredPacket mw_geoNwBroadcastPacketWithAreaWithNextHeader(
                in template (present) LongPosVector p_sourceLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea,
                in template (present) NextHeader p_nextHeader
            ) modifies mw_geoNwBroadcastPacketWithArea := {
                commonHeader := {
                    nextHeader := p_nextHeader
                }
            }
            
        } // end group geoNwPacketBroadcastTemplates
        
        group geoNwPacketLsTemplates {
            
            /**
             * @desc    Send template for GeoNetworking LS Request Packet
             * @param   p_sourceLongPosVec  Long position vector of source
             * @param   p_seqNumber         Sequence number of LS Request packet
             * @param   p_gnAddress         Searched GN_Address
             */
            template (value) GnNonSecuredPacket m_geoNwLsRequestPacket(
                in template (value) LongPosVector p_sourceLongPosVec,
                in template (value) UInt16 p_seqNumber,
                in template (value) GN_Address p_gnAddress
            ) := {
                commonHeader := m_commonHeader(
wattelet's avatar
wattelet committed
                    e_any,
tepelmann's avatar
tepelmann committed
                    m_lsRequestHeaderType,
                    m_trafficClass,
                    c_defaultHopLimit
                ),
                extendedHeader := m_lsRequestHeader(
                    p_sourceLongPosVec, p_seqNumber, p_gnAddress
                ),
                payload := omit
            }
            
            /**
             * @desc    Receive template for GeoNetworking LS Request Packet
             * @param   p_seqNumber     Sequence number of LS Request packet
             * @param   p_mid           Searched GN_Address MID
             */
            template (present) GnNonSecuredPacket mw_geoNwLsRequestPacket(
YannGarcia's avatar
YannGarcia committed
                                                                          template (present) UInt16 p_seqNumber := ?,
                                                                          template (present) GN_Address.mid p_mid := ?
tepelmann's avatar
tepelmann committed
            ) := {
                commonHeader := mw_commonHeader(
tepelmann's avatar
tepelmann committed
                    m_lsRequestHeaderType
                ),
                extendedHeader := mw_lsRequestHeader(
                    p_seqNumber,
                    p_mid
                ),
                payload := omit
tepelmann's avatar
tepelmann committed
            }
            
            /**
             * @desc    Send template for GeoNetworking LS Reply Packet
             * @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
             */
            template (value) GnNonSecuredPacket m_geoNwLsReplyPacket(
                in template (value) LongPosVector p_sourceLongPosVec,
                in template (value) ShortPosVector p_destinationLongPosVec,
                in template (value) UInt16 p_seqNumber
            ) := {
                commonHeader := m_commonHeader(
tepelmann's avatar
tepelmann committed
                    m_lsReplyHeaderType,
                    m_trafficClass,
                    c_defaultHopLimit
                ),
                extendedHeader := m_lsReplyHeader(
                    p_sourceLongPosVec, p_destinationLongPosVec, p_seqNumber
                ),
                payload := omit
            }
            
            /**
             * @desc    Receive template for GeoNetworking LS Reply Packet
             * @param   p_sourceLongPosVec      Long position vector of source
             * @param   p_destinationLongPosVec Short position vector of destination
             */
            template (present) GnNonSecuredPacket mw_geoNwLsReplyPacket(
YannGarcia's avatar
YannGarcia committed
                                                                        template (present) LongPosVector p_sourceLongPosVec := ?,
                                                                        template (present) ShortPosVector p_destinationLongPosVec := ?
tepelmann's avatar
tepelmann committed
            ) := {
                commonHeader := mw_commonHeader(
tepelmann's avatar
tepelmann committed
                    m_lsReplyHeaderType
                ),
                extendedHeader := mw_lsReplyHeader(
                    p_sourceLongPosVec, p_destinationLongPosVec
                ),
                payload := omit
tepelmann's avatar
tepelmann committed
            }
            
        } // end group geoNwPacketLsTemplates
        
        group geoNwPacketBeaconTemplates {
            
            /**
             * @desc    Send template for GeoNetworking Beacon Packet
             * @param   p_sourceLongPosVec  Long position vector of source
             */
            template (value) GnNonSecuredPacket m_geoNwBeaconPacket(
                in template (value) LongPosVector p_sourceLongPosVec
            ) := {
                commonHeader := m_commonHeader(
wattelet's avatar
wattelet committed
                    e_any,
tepelmann's avatar
tepelmann committed
                    m_beaconHeaderType,
                    m_trafficClass,
berge's avatar
berge committed
                    c_hopLimit1
tepelmann's avatar
tepelmann committed
                ),
                extendedHeader := m_beaconHeader(
                    p_sourceLongPosVec
                ),
                payload := omit
            }
            
            /**
             * @desc    Receive template for GeoNetworking Beacon Packet
tepelmann's avatar
tepelmann committed
             *
tepelmann's avatar
tepelmann committed
             * @param   p_sourceLongPosVec  Long position vector of source (Default: ?)
             * @param   p_nextHeader        Next header (Default: e_any)
tepelmann's avatar
tepelmann committed
             */
            template (present) GnNonSecuredPacket mw_geoNwBeaconPacket(
                in template (present) LongPosVector p_sourceLongPosVec := ?,
                in template (present) NextHeader p_nextHeader := e_any
tepelmann's avatar
tepelmann committed
            ) := {
                commonHeader := mw_commonHeader_noPayload(
                    p_nextHeader,
tepelmann's avatar
tepelmann committed
                    m_beaconHeaderType
                ),
                extendedHeader := mw_beaconHeader(p_sourceLongPosVec),
                payload := '00000000000000000000'O ifpresent //(*, '00000000000000000000'O)
tepelmann's avatar
tepelmann committed
            }
            
        } // end group geoNwPacketBeaconTemplates
        
        group geoNwPacketShbTemplates {
            
            /**
             * @desc    Send template for GeoNetworking SHB Packet
             * @param   p_sourceLongPosVec  Long position vector of source
             */
            template (value) GnNonSecuredPacket m_geoNwShbPacket(
                in template (value) LongPosVector p_sourceLongPosVec
            ) := {
                commonHeader := valueof(m_commonHeader(
tepelmann's avatar
tepelmann committed
                    PX_GN_UPPER_LAYER,
                    m_shbHeaderType,
                    m_trafficClass,
                    c_defaultHopLimit
                )),
                extendedHeader := valueof(m_shbHeader(
tepelmann's avatar
tepelmann committed
                    p_sourceLongPosVec
                payload :=  valueof(char2oct("DEFAULT_PAYLOAD"))
tepelmann's avatar
tepelmann committed
            }
            
            /**
             * @desc    Receive template for GeoNetworking SHB Packet
             * @param   p_sourceLongPosVec  Long position vector of source (Default: ?)
             * @param   p_hopLimit          Maximum number of hops (Default: ?)
tepelmann's avatar
tepelmann committed
             */
            template (present) GnNonSecuredPacket mw_geoNwShbPacket(
                in template (present) LongPosVector p_sourceLongPosVec := ?,
                in template (present) UInt8 p_hopLimit := ?
tepelmann's avatar
tepelmann committed
            ) := {
                commonHeader := mw_commonHeaderWithHopLimit(
tepelmann's avatar
tepelmann committed
                    PX_GN_UPPER_LAYER,
tepelmann's avatar
tepelmann committed
                ),
                extendedHeader := mw_shbHeader(p_sourceLongPosVec),
tepelmann's avatar
tepelmann committed
            }
            
        } // end group geoNwPacketShbTemplates
        
        group geoNwPacketTsbTemplates {
            
            /**
             * @desc    Send template for GeoNetworking TSB Packet
             * @param   p_seqNumber         Sequence number of TSB packet
             * @param   p_sourceLongPosVec  Long position vector of source
             * @param   p_hopLimit          The maximum number of hops (Default: c_defaultHopLimit)
tepelmann's avatar
tepelmann committed
             */
            template (value) GnNonSecuredPacket m_geoNwTsbPacket(
                in template (value) UInt16 p_seqNumber,
                in template (value) LongPosVector p_sourceLongPosVec,
                in template (value) UInt8 p_hopLimit := c_defaultHopLimit,
                in template (value) TrafficClass p_trafficClass := m_trafficClass
tepelmann's avatar
tepelmann committed
            ) := {
                commonHeader := valueof(m_commonHeader(
tepelmann's avatar
tepelmann committed
                    PX_GN_UPPER_LAYER,
                    m_tsbHeaderType,
                    p_trafficClass,
                )),
                extendedHeader := valueof(m_tsbHeader(
tepelmann's avatar
tepelmann committed
                    p_seqNumber,
                    p_sourceLongPosVec
                payload :=  valueof(char2oct("DEFAULT_PAYLOAD"))
tepelmann's avatar
tepelmann committed
            }
            
            /**
             * @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),
            /**
             * @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_hopLimit          The maximum number of hops (Default: ?)
             */
            template (present) GnNonSecuredPacket mw_geoNwTsbPacketWithHl(
                in template (present) UInt16 p_seqNumber := ?,
                in template (present) LongPosVector p_sourceLongPosVec := ?,
                in template (present) UInt8 p_hopLimit := ?
            ) modifies mw_geoNwTsbPacket := {
                commonHeader := mw_commonHeaderWithHopLimit(
                    PX_GN_UPPER_LAYER,
                    m_tsbHeaderType,
                    p_hopLimit
                )
            }
            
tepelmann's avatar
tepelmann committed
            /**
             * @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
        
        group geoNwPacketSaTemplates {
            
            /**
             * @desc    Send template for GeoNetworking SA Packet
             * @param   p_seqNumber         Sequence number of SA packet
             * @param   p_sourceLongPosVec  Long position vector of source
             * @param   p_hopLimit          The maximum number of hops (Default: c_defaultHopLimit)
             */
            template (value) GnNonSecuredPacket m_geoNwSaPacket(
                in template (value) UInt16 p_seqNumber,
                in template (value) LongPosVector p_sourceLongPosVec,
                in template (value) UInt8 p_hopLimit := c_defaultHopLimit,
                in template (value) TrafficClass p_trafficClass := m_trafficClass
            ) := {
                commonHeader := valueof(m_commonHeader(
                    PX_GN_UPPER_LAYER,
                    m_saHeaderType_sa,
                    p_trafficClass,
                    p_hopLimit
                )),
                extendedHeader := valueof(m_tsbHeader(
                    p_seqNumber,
                    p_sourceLongPosVec
                )),
                payload := '00100011010203CAFEDECA'O
            }
            
            /**
             * @desc    Receive template for GeoNetworking SA Packet
             * @param   p_seqNumber         Sequence number of SA packet (Default: ?)
             * @param   p_sourceLongPosVec  Long position vector of source (Default: ?)
             */
            template (present) GnNonSecuredPacket mw_geoNwSaPacket(
                in template (present) UInt16 p_seqNumber := ?,
                in template (present) LongPosVector p_sourceLongPosVec := ?
            ) := {
                commonHeader := mw_commonHeader(
                    PX_GN_UPPER_LAYER,
                    m_saHeaderType_sa
                ),
                extendedHeader := mw_saHeader(p_seqNumber, p_sourceLongPosVec),
            }
            
            /**
             * @desc    Receive template for GeoNetworking SA Packet
             * @param   p_seqNumber         Sequence number of SA packet (Default: ?)
             * @param   p_sourceLongPosVec  Long position vector of source (Default: ?)
             * @param   p_hopLimit          The maximum number of hops (Default: ?)
             */
            template (present) GnNonSecuredPacket mw_geoNwSaPacketWithHl(
                in template (present) UInt16 p_seqNumber := ?,
                in template (present) LongPosVector p_sourceLongPosVec := ?,
                in template (present) UInt8 p_hopLimit := ?
            ) modifies mw_geoNwSaPacket := {
                commonHeader := mw_commonHeaderWithHopLimit(
                    PX_GN_UPPER_LAYER,
                    m_saHeaderType_sa,
                    p_hopLimit
                )
            }
            
            /**
             * @desc    Receive template for GeoNetworking SA Packet
             * @param   p_seqNumber         Sequence number of SA packet (Default: ?)
             * @param   p_sourceLongPosVec  Long position vector of source (Default: ?)
             * @param   p_nextHeader        Id of next header
             */
            template (present) GnNonSecuredPacket mw_geoNwSaPacketWithNextHeader(
                in template (present) UInt16 p_seqNumber := ?,
                in template (present) LongPosVector p_sourceLongPosVec := ?,
                in template (value) NextHeader p_nextHeader
            ) modifies mw_geoNwSaPacket := {
                commonHeader := {
                    nextHeader := p_nextHeader
                }
            }
            
        } // end group geoNwPacketSaTemplates
        
tepelmann's avatar
tepelmann committed
    } // end group geoNwPacketTemplates
    
    group geoNwHeadersTemplates {
        
tepelmann's avatar
tepelmann committed
        group geoNwBasicHeaderTemplates {
            
            /**
tepelmann's avatar
tepelmann committed
             * @desc    Send template for Basic header
             *
tepelmann's avatar
tepelmann committed
             * @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
            ) := {
tepelmann's avatar
tepelmann committed
                version := c_geoNwProtocolVersion,
                nextHeader := e_commonHeader,
tepelmann's avatar
tepelmann committed
                reserved := 0,
                lifeTime := p_lifeTime,
                routerHopLimit := p_hopLimit
            }
            
            /**
tepelmann's avatar
tepelmann committed
             * @desc    Receive template for Basic header
             *
tepelmann's avatar
tepelmann committed
             * @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 := ?
            ) := {
tepelmann's avatar
tepelmann committed
                version := c_geoNwProtocolVersion,
tepelmann's avatar
tepelmann committed
                nextHeader := ?,
                reserved := ?,
                lifeTime := p_lifeTime,
                routerHopLimit := p_hopLimit
            }
            
            /**
             * @desc    Send template for Secured Basic header
             *
             * @param p_lifeTime    Lifetime of GeoNetworking message
             * @param p_hopLimit    Router Hop limit of GeoNetworking message
             */
            template (value) BasicHeader m_securedBasicHeader(
garciay's avatar
garciay committed
                in template (value) Lifetime p_lifeTime := {
                    multiplier := c_defaultLifetime,
                    ltBase := e_100s
                  }/*FIXME Bug TITAN ? m_defaultLifetime*/,
                in template (value) UInt8 p_hopLimit := c_defaultHopLimit
            ) := {
                version := c_geoNwProtocolVersion,
                nextHeader := e_securedPacket,
                reserved := 0,
                lifeTime := p_lifeTime,
                routerHopLimit := p_hopLimit
            } // End of template m_securedBasicHeader
            
            /**
             * @desc    Receive template for Secured Basic header
             *
             * @param p_lifeTime    Lifetime of GeoNetworking message
             * @param p_hopLimit    Router Hop limit of GeoNetworking message
             */
            template (present) BasicHeader mw_securedBasicHeader(
                in template (present) Lifetime p_lifeTime := ?,
                in template (present) UInt8 p_hopLimit := ?
            ) := {
                version := c_geoNwProtocolVersion,
                nextHeader := e_securedPacket,
                reserved := ?,
                lifeTime := p_lifeTime,
                routerHopLimit := p_hopLimit
            } // End of template mw_securedBasicHeader
            
tepelmann's avatar
tepelmann committed
            /**
             * @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 {
            
tepelmann's avatar
tepelmann committed
             * @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
tepelmann's avatar
tepelmann committed
             * @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
             */
YannGarcia's avatar
YannGarcia committed
            template (present) CommonHeader mw_commonHeader (
                                                             template (present) NextHeader p_nextHeader := ?,
                                                             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
                plLength := ?,
tepelmann's avatar
tepelmann committed
                maxHopLimit := ?,
                reserved2 := ?
            /**
             * @desc    Receive template for Common header with no payload
             * @param   p_nextHeader        Id of next header
             * @param   p_headerTypeSubType         Header's type and sub-type
             */
YannGarcia's avatar
YannGarcia committed
            template (present) CommonHeader mw_commonHeader_noPayload (
                in template (present) NextHeader p_nextHeader := ?,
                in template (present) HeaderTST p_headerTypeSubType := ?
            ) modifies mw_commonHeader := {
                plLength := 0
            }
            
            /**
             * @desc    Receive template for Common header with specific Hop limit
berge's avatar
berge committed
             * @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
             */
YannGarcia's avatar
YannGarcia committed
            template (present) CommonHeader mw_commonHeaderWithHopLimit (
                in template (present) NextHeader p_nextHeader := ?,
                in template (present) HeaderTST p_headerTypeSubType := ?,
                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 Hop limit
tepelmann's avatar
tepelmann 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_hopLimit          Maximum number of hops
             * @param   p_flags             Flags in the common header
             * @see     mw_commonHeaderWithHopLimit
             */
YannGarcia's avatar
YannGarcia committed
            template (present) CommonHeader mw_commonHeaderWithHopLimitAndFlags (
                in template (present) NextHeader p_nextHeader := ?,
                in template (present) HeaderTST p_headerTypeSubType := ?,
                in template (present) UInt8 p_hopLimit := ?,
                in template (present) Bit8 p_flags := ?
            ) modifies mw_commonHeaderWithHopLimit := {
                flags := p_flags
            }
            
             * @desc    Receive template for Common header with specific Traffic Class
tepelmann's avatar
tepelmann committed
             * @param   p_senderLongPosVec  Long position vector of sender
berge's avatar
berge committed
             * @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
             */
YannGarcia's avatar
YannGarcia committed
            template (present) 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
             */
YannGarcia's avatar
YannGarcia committed
            template (value) TrafficClass m_trafficClass ( in SCF p_scf := e_scfEnabled, in ChannelOffload p_ChOff := e_choffDisabled ) := {
wattelet's avatar
wattelet committed
                scf             := p_scf,
                channelOffload  := p_ChOff,
            /**
             * @desc    Receive template for traffic class
berge's avatar
berge committed
             */
garciay's avatar
garciay committed
            template TrafficClass mw_trafficClass ( in template(present) SCF p_scf := ?, in template(present) ChannelOffload p_ChOff := ? ) := {
wattelet's avatar
wattelet committed
                scf             := p_scf,
                channelOffload  := p_ChOff,
                tcId            := ?
            }
            /**
             * @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
             */
YannGarcia's avatar
YannGarcia committed
            template (present) LongPosVector mw_longPosVectorAny(
                                                                 in template (present) GN_Address p_gnAddress := ?
berge's avatar
berge committed
            ) := {
                gnAddr := p_gnAddress,
                latitude := ?,
                longitude := ?,
tepelmann's avatar
tepelmann committed
                pai := ?,
                speed := ?,
tepelmann's avatar
tepelmann committed
                heading := ?
fischer's avatar
fischer committed
            }
tepelmann's avatar
tepelmann committed
             * @desc    Receive template for long position vector with strict position check
             * @param   p_longPosVector The base long position vector
             */
YannGarcia's avatar
YannGarcia committed
            template (present) LongPosVector mw_longPosVectorPosition(
                                                                      template (present) LongPosVector p_longPosVector := ?
garciay's avatar
garciay committed
                latitude := f_getDelta32(valueof(p_longPosVector.latitude), PX_POS_DELTA),
                longitude := f_getDelta32(valueof(p_longPosVector.longitude), PX_POS_DELTA),
tepelmann's avatar
tepelmann committed
                pai := ?,
garciay's avatar
garciay committed
                //FIXME May the delta factor should be based on the actual speed value -> low speed=lower delta, high speed=higher delta
                speed := f_getDelta15(valueof(p_longPosVector.speed), float2int(int2float(valueof(p_longPosVector.speed)) * 0.03)),
tepelmann's avatar
tepelmann committed
                heading := p_longPosVector.heading
             * @desc    Receive template for short position vector with strict position check
             * @param   p_shortPosVector The base short position vector
             */
YannGarcia's avatar
YannGarcia committed
            template (present) ShortPosVector mw_shortPosVectorPosition(
                                                                        template (present) ShortPosVector p_shortPosVector := ?
garciay's avatar
garciay committed
                gnAddr := p_shortPosVector.gnAddr,
                timestamp_ := ?,
                latitude := f_getDelta32(valueof(p_shortPosVector.latitude), PX_POS_DELTA),
                longitude := f_getDelta32(valueof(p_shortPosVector.longitude), PX_POS_DELTA)
tepelmann's avatar
tepelmann committed
             * @desc    Receive template for short position vector without position check
             * @param   p_shortPosVector The base short position vector
             */
YannGarcia's avatar
YannGarcia committed
            template (present) ShortPosVector mw_shortPosVectorPosition_anyPos(
                                                                               template (present) ShortPosVector p_shortPosVector := ?
            ) modifies mw_shortPosVectorPosition := {
                    latitude := ?,
                    longitude := ?
            }
tepelmann's avatar
tepelmann committed
            function f_getDelta32(Int32 p_value, integer p_delta) return template (present) Int32 {
                if (p_value == c_int32Min) {
                    return (p_value .. p_value+p_delta);
                }
                if (p_value == c_int32Max) {
                    return (p_value-p_delta .. p_value);
                }
                return (p_value-p_delta .. p_value+p_delta);
            }
            
            function f_getDelta15(Int32 p_value, integer p_delta) return template (present) Int15 {
              log(">>> f_getDelta15: ", p_value, ", ", p_delta);
tepelmann's avatar
tepelmann committed
                if (p_value == c_int15Min) {
                    return (p_value .. p_value+p_delta);
                }
                if (p_value == c_int15Max) {
                    return (p_value-p_delta .. p_value);
                }
                return (p_value-p_delta .. p_value+p_delta);
            }
            
        } // end geoNwCommonHeaderTemplates
berge's avatar
berge committed
        group geoUnicastHeaderTemplates {
            
            /**
             * @desc    Send template for GeoUnicast header
tepelmann's avatar
tepelmann committed
             * @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
             */
YannGarcia's avatar
YannGarcia committed
            template (present) ExtendedHeader mw_geoUnicastHeader(
                                                                  template (present) ShortPosVector p_destinationShortPosVec := ?,
                                                                  template (present) UInt16 p_seqNumber := ?
berge's avatar
berge committed
            ) := {
                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
             */
YannGarcia's avatar
YannGarcia committed
            template (present) ExtendedHeader mw_geoUnicastHeaderWithSourcePv(
                                                                              template (present) ShortPosVector p_destinationShortPosVec := ?,
                                                                              template (present) UInt16 p_seqNumber := ?,
                                                                              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 := valueof(p_seqNumber),
                    reserved := c_uInt8Zero,
                    srcPosVector := valueof(p_sourceLongPosVec),
                    geoAreaPosLatitude := valueof(p_broadcastArea.geoBroadcastArea.geoAreaPosLatitude),
                    geoAreaPosLongitude := valueof(p_broadcastArea.geoBroadcastArea.geoAreaPosLongitude),
                    distanceA := valueof(p_broadcastArea.geoBroadcastArea.distanceA),
                    distanceB := valueof(p_broadcastArea.geoBroadcastArea.distanceB),
                    angle := valueof(p_broadcastArea.geoBroadcastArea.angle),
                    reserved2 := c_uInt24Zero
tepelmann's avatar
tepelmann committed
            }
            /**
             * @desc    Receive template for GeoBroadcast header for any GeoArea
             * @param   p_sourceLongPosVec  Long position vector of source
tepelmann's avatar
tepelmann committed
             * @param   p_senderLongPosVec  Long position vector of sender
             * @param   p_seqNumber         Sequence number of GeoBroadcast packet
berge's avatar
berge committed
             */
YannGarcia's avatar
YannGarcia committed
            template (present) ExtendedHeader mw_geoBroadcastHeader(
                                                                    template (present) LongPosVector p_sourceLongPosVec := ?,
                                                                    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
tepelmann's avatar
tepelmann committed
             * @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
             */
YannGarcia's avatar
YannGarcia committed
            template (present) ExtendedHeader mw_geoBroadcastHeaderWithArea (
                                                                             template (present) LongPosVector p_sourceLongPosVec := ?,
                                                                             template (present) UInt16 p_seqNumber := ?,
                                                                             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
tepelmann's avatar
tepelmann committed
            }
tepelmann's avatar
tepelmann committed
             * @desc    Receive template for GeoBroadcast header type
berge's avatar
berge committed
             */
YannGarcia's avatar
YannGarcia committed
            template (present) 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
             */
YannGarcia's avatar
YannGarcia committed
            template (present) HeaderTST mw_geoBroadcastHeaderTypeWithSubType(
                                                                              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 := valueof(p_seqNumber),
berge's avatar
berge committed
                    reserved := c_uInt8Zero,
                    srcPosVector := valueof(p_sourceLongPosVec),
                    geoAreaPosLatitude := valueof(p_anycastArea.geoAnycastArea.geoAreaPosLatitude),
                    geoAreaPosLongitude := valueof(p_anycastArea.geoAnycastArea.geoAreaPosLongitude),
                    distanceA := valueof(p_anycastArea.geoAnycastArea.distanceA),
                    distanceB := valueof(p_anycastArea.geoAnycastArea.distanceB),
                    angle := valueof(p_anycastArea.geoAnycastArea.angle),
berge's avatar
berge committed
                    reserved2 := c_uInt24Zero
            /**
             * @desc    Receive template for GeoAnycast header for any GeoArea
             * @param   p_sourceLongPosVec  Long position vector of source
tepelmann's avatar
tepelmann committed
             * @param   p_senderLongPosVec  Long position vector of sender
             * @param   p_seqNumber         Sequence number of GeoAnycast packet
berge's avatar
berge committed
             */
YannGarcia's avatar
YannGarcia committed
            template (present) ExtendedHeader mw_geoAnycastHeader(
                                                                  template (present) LongPosVector p_sourceLongPosVec := ?,
                                                                  template (present) UInt16 p_seqNumber := ?