Msg File src/inet/linklayer/ieee8021as/GptpPacket.msg
Name | Type | Description |
---|---|---|
GptpNodeType | enum | (no description) |
GptpPortType | enum | (no description) |
GptpMessageType | enum | (no description) |
GptpSelfMsgKind | enum | (no description) |
GptpFlags | enum |
ieee802.1AS-2020 10.6.2.2.8: flags (Octet2) Table 10-9—Values of flag bits |
GptpTlvType | enum | (no description) |
PortIdentity | struct | (no description) |
GptpReqAnswerEvent | message | (no description) |
GptpBase | class |
ieee802.1AS-2020 10.6.2.1, 11.4.2 |
GptpTlv | class | (no description) |
GptpFollowUpInformationTlv | class |
The fields of the Follow_Up information TLV shall be as specified in Table 11-11 and in 11.4.4.3.2 through 11.4.4.3.9. This TLV is a standard organization extension TLV for the Follow_Up message, as specified in 14.3 of IEEE Std 1588-2019. NOTE—The Follow_Up information TLV is different from the CUMULATIVE_RATE_RATIO TLV of IEEE Std 1588- 2019 (see 16.10 and Table 52 of IEEE Std 1588-2019). While both TLVs carry cumulative rate offset information, the Follow_Up information TLV also carries information on the Grandmaster Clock time base, most recent phase change, and most recent frequency change. The CUMULATIVE_RATE_RATIO TLV is not used by gPTP. |
GptpSync | class | (no description) |
GptpFollowUp | class | (no description) |
GptpPdelayReq | class | (no description) |
GptpPdelayResp | class | (no description) |
GptpPdelayRespFollowUp | class | (no description) |
GptpIngressTimeInd | class | (no description) |
Source code
// // Copyright (C) 2020 OpenSim Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later // // // @authors: Enkhtuvshin Janchivnyambuu // Henning Puttnies // Peter Danielis // University of Rostock, Germany // import inet.clock.common.ClockEvent; import inet.clock.contract.ClockTime; import inet.common.TagBase; import inet.common.packet.chunk.Chunk; import inet.common.packet.Packet; cplusplus {{ #include "inet/common/Units.h" #include "inet/clock/common/ClockEvent.h" namespace inet { using namespace inet::units::values; const B GPTP_HEADER_SIZE = B(34); const B GPTP_TLV_SIZE = B(4); const B GPTP_FOLLOW_UP_INFORMATION_TLV_BODYSIZE = B(28); const B GPTP_SYNC_1STEP_PACKET_SIZE = GPTP_HEADER_SIZE + B(10) + GPTP_TLV_SIZE + GPTP_FOLLOW_UP_INFORMATION_TLV_BODYSIZE; const B GPTP_SYNC_2STEP_PACKET_SIZE = GPTP_HEADER_SIZE + B(10); const B GPTP_FOLLOW_UP_PACKET_SIZE = GPTP_HEADER_SIZE + B(10) + GPTP_TLV_SIZE + GPTP_FOLLOW_UP_INFORMATION_TLV_BODYSIZE; const B GPTP_PDELAY_REQ_PACKET_SIZE = GPTP_HEADER_SIZE + B(20); const B GPTP_PDELAY_RESP_PACKET_SIZE = GPTP_HEADER_SIZE + B(20); const B GPTP_PDELAY_RESP_FOLLOW_UP_PACKET_SIZE = GPTP_HEADER_SIZE + B(20); } }} namespace inet; @property[bit](type=int; usage=field; desc="define stored size in bits"); enum GptpNodeType { MASTER_NODE = 11; BRIDGE_NODE = 12; SLAVE_NODE = 13; } enum GptpPortType { MASTER_PORT = 2; SLAVE_PORT = 1; PASSIVE_PORT = 0; } enum GptpMessageType { GPTPTYPE_SYNC = 0x0; GPTPTYPE_FOLLOW_UP = 0x8; GPTPTYPE_PDELAY_REQ = 0x2; GPTPTYPE_PDELAY_RESP = 0x3; GPTPTYPE_PDELAY_RESP_FOLLOW_UP = 0xA; } enum GptpSelfMsgKind { GPTP_SELF_REQ_ANSWER_KIND = 101; GPTP_SELF_MSG_SYNC = 103; GPTP_REQUEST_TO_SEND_SYNC = 104; GPTP_SELF_MSG_PDELAY_REQ = 105; } // ieee802.1AS-2020 10.6.2.2.8: flags (Octet2) // Table 10-9—Values of flag bits enum GptpFlags { alternateMasterFlag = 1; // Not used in this standard; transmitted as FALSE and ignored on reception twoStepFlag = 2; // For Sync messages: // a) For a one-step transmitting PTP Port (see 11.1.3 and 11.2.13.9), the value is FALSE. // b) For a two-step transmitting PTP Port, the value is TRUE. // For Pdelay_Resp messages: The value is transmitted as TRUE and ignored on reception // TODO add more flags } enum GptpTlvType { GPTP_FOLLOW_UP_INFORMATION_TLV = 0x03; } //struct Timestamp //{ // UInteger48 seconds; // UInteger32 nanoseconds; //}; //struct ExtendedTimestamp //{ // UInteger48 seconds; // UInteger48 fractionalNanoseconds; //}; //typedef Octet8 ClockIdentity; struct PortIdentity { @packetData; uint64_t clockIdentity; uint16_t portNumber; }; //struct ClockQuality //{ // UInteger8 clockClass; // Enumeration8 clockAccuracy; // UInteger16 offsetScaledLogVariance; //}; message GptpReqAnswerEvent extends ClockEvent { int portId; clocktime_t ingressTimestamp; PortIdentity sourcePortIdentity; uint16_t sequenceId; } // ieee802.1AS-2020 10.6.2.1, 11.4.2 class GptpBase extends FieldsChunk { uint8_t majorSdoId @bit(4); // The value is specified in 8.1 for all transmitted PTP messages of a gPTP domain. The value is specified in // 11.2.17 for all transmitted PTP messages of the Common Mean Link Delay Service. Any PTP message // received for which the value is not one of the values specified in those subclauses shall be ignored. GptpMessageType messageType @bit(4); uint8_t minorVersionPTP @bit(4) = 1; // For transmitted messages, the value shall be 1 (see 7.5.4 and 13.3.2.5 of IEEE Std 1588-2019). // For received messages, the value is ignored. uint8_t versionPTP @bit(4) = 2; // For transmitted messages, the value shall be 2 (see 7.5.4 and 13.3.2.4 of IEEE Std 1588-2019). For received // messages, if the value is not 2, the entire message shall be ignored. uint16_t messageLengthField @bit(16); // The value is the total number of octets that form the PTP message. uint8_t domainNumber @bit(8); // The domainNumber for Pdelay_Req, Pdelay_Resp, and Pdelay_Resp_Follow_Up messages shall be 0. // The domainNumber for all other PTP messages is as specified in 10.6.2.2.6. uint8_t minorSdoId @bit(8); // The value is specified in 8.1 for all transmitted PTP messages of a gPTP domain. The value is specified in // 11.2.17 for all transmitted PTP messages of the Common Mean Link Delay Service. Any PTP message // received for which the value is not one of the values specified in those subclauses shall be ignored. // Currently unused in INET uint16_t flags @bit(16); // 10.6.2.2.8 flags (Octet2) // The value of the bits of the array are defined in Table 10-9. For message types where the bit is not defined in // Table 10-9, the value of the bit is set to FALSE. // Use ~GptpFlags enums. clocktime_t correctionField @bit(64) = 0; // The correctionField is the value of the correction as specified in Table 11-6, measured in nanoseconds and // multiplied by 2^16. For example, 2.5 ns is represented as 0x0000000000028000. uint32_t messageTypeSpecific @bit(32); // The value of the messageTypeSpecific field varies, based on the value of the messageType field, as described in Table 10-10. PortIdentity sourcePortIdentity @bit(80); // The value is the PTP Port identity attribute (see 8.5.2) of the PTP Port that transmits the PTP message. uint16_t sequenceId @bit(16); // The sequenceId field is assigned as specified in 10.5.7. uint8_t controlField @bit(8) = 0; // The value is 0. uint8_t logMessageInterval @bit(8); // For Sync and Follow_Up messages, the value is the value of currentLogSyncInterval (see 10.2.5.4 and // 10.7.2.3). For Pdelay_Req messages, the value is the value of currentLogPdelayReqInterval. For // Pdelay_Resp and Pdelay_Resp_Follow_Up messages, the value is transmitted as 0x7F and ignored on // reception. } class GptpTlv { @packetData; GptpTlvType tlvType @bit(16); uint16_t lengthField @bit(16); } // The fields of the Follow_Up information TLV shall be as specified in Table 11-11 and in 11.4.4.3.2 through // 11.4.4.3.9. This TLV is a standard organization extension TLV for the Follow_Up message, as specified in // 14.3 of IEEE Std 1588-2019. // NOTE—The Follow_Up information TLV is different from the CUMULATIVE_RATE_RATIO TLV of IEEE Std 1588- // 2019 (see 16.10 and Table 52 of IEEE Std 1588-2019). While both TLVs carry cumulative rate offset information, the // Follow_Up information TLV also carries information on the Grandmaster Clock time base, most recent phase change, // and most recent frequency change. The CUMULATIVE_RATE_RATIO TLV is not used by gPTP. class GptpFollowUpInformationTlv extends GptpTlv { tlvType = GPTP_FOLLOW_UP_INFORMATION_TLV; uint16_t lengthField @bit(16) = B(GPTP_FOLLOW_UP_INFORMATION_TLV_BODYSIZE).get(); uint32_t organizationId @bit(24) = 0x0080C2; uint32_t organizationSubType @bit(24) = 1; double rateRatio @bit(32); // 11.4.4.3.6 The value of cumulativeScaledRateOffset is equal to (rateRatio – 1.0) / (2^41), truncated to the next smaller // signed integer, where rateRatio is the ratio of the frequency of the Grandmaster Clock to the frequency of the // LocalClock entity in the PTP Instance that sends the message. uint16_t gmTimeBaseIndicator @bit(16); // The value of gmTimeBaseIndicator is the timeBaseIndicator of the ClockSource entity for the current // Grandmaster PTP Instance (see 9.2.2.3). clocktime_t lastGmPhaseChange @bit(96); // The value of lastGmPhaseChange is the time of the current Grandmaster Clock minus the time of the // previous Grandmaster Clock, at the time that the current Grandmaster PTP Instance became the // Grandmaster PTP Instance. The value is copied from the lastGmPhaseChange member of the MDSyncSend // structure whose receipt causes the MD entity to send the Follow_Up message (see 11.2.11). int32_t scaledLastGmFreqChange @bit(32); // The value of scaledLastGmFreqChange is the fractional frequency offset of the current Grandmaster Clock // relative to the previous Grandmaster Clock, at the time that the current Grandmaster PTP Instance became // the Grandmaster PTP Instance, or relative to itself prior to the last change in gmTimeBaseIndicator, // multiplied by 241 and truncated to the next smaller signed integer. The value is obtained by multiplying the // lastGmFreqChange member of MDSyncSend whose receipt causes the MD entity to send the Follow_Up // message (see 11.2.11) by 241, and truncating to the next smaller signed integer. } cplusplus(GptpFollowUpInformationTlv) {{ void setCumulativeScaledRateOffset(int32_t x) { setRateRatio(1.0 + (double)(x) / (double)((uint64_t)1<<41)); } int32_t getCumulativeScaledRateOffset() const { return (int32_t)ceil((getRateRatio() - 1.0) * (double)((uint64_t)1<<41)); } }} class GptpSync extends GptpBase { messageType = GPTPTYPE_SYNC; flags = twoStepFlag; chunkLength = GPTP_SYNC_2STEP_PACKET_SIZE; messageLengthField = B(GPTP_SYNC_2STEP_PACKET_SIZE).get(); // clocktime_t originTimestamp; // filled when twoStep flag is FALSE // followUpInformationTLV; // filled when twoStep flag is FALSE } class GptpFollowUp extends GptpBase { messageType = GPTPTYPE_FOLLOW_UP; chunkLength = GPTP_FOLLOW_UP_PACKET_SIZE; messageLengthField = B(GPTP_FOLLOW_UP_PACKET_SIZE).get(); clocktime_t preciseOriginTimestamp; // 11.4.4.2.1 GptpFollowUpInformationTlv followUpInformationTLV; } class GptpPdelayReq extends GptpBase { messageType = GPTPTYPE_PDELAY_REQ; chunkLength = GPTP_PDELAY_REQ_PACKET_SIZE; messageLengthField = B(GPTP_PDELAY_REQ_PACKET_SIZE).get(); clocktime_t reserved1; clocktime_t reserved2; } class GptpPdelayResp extends GptpBase { messageType = GPTPTYPE_PDELAY_RESP; chunkLength = GPTP_PDELAY_RESP_PACKET_SIZE; messageLengthField = B(GPTP_PDELAY_RESP_PACKET_SIZE).get(); clocktime_t requestReceiptTimestamp; PortIdentity requestingPortIdentity; } class GptpPdelayRespFollowUp extends GptpBase { messageType = GPTPTYPE_PDELAY_RESP_FOLLOW_UP; chunkLength = GPTP_PDELAY_RESP_FOLLOW_UP_PACKET_SIZE; messageLengthField = B(GPTP_PDELAY_RESP_FOLLOW_UP_PACKET_SIZE).get(); clocktime_t responseOriginTimestamp; PortIdentity requestingPortIdentity; } class GptpIngressTimeInd extends TagBase { clocktime_t arrivalClockTime; }