/* * Copyright (c) 2024 BayLibre SAS * * SPDX-License-Identifier: Apache-2.0 */ /** * @file ddt.h * @brief Derived data types. * * @note Based on IEEE 1588:2019 section 5.3 - Derived data types */ #ifndef ZEPHYR_INCLUDE_PTP_DDT_H_ #define ZEPHYR_INCLUDE_PTP_DDT_H_ #include #include #ifdef __cplusplus extern "C" { #endif /** * @brief PTP time interval in nanoseconds. * @note 5.3.2 - time interval expressed in nanoseconds multiplied by 2^16 */ typedef int64_t ptp_timeinterval; /** * @brief Structure for storing PTP timestamp used in PTP Protocol. * @note 5.3.3 - timestamp with respect to epoch */ struct ptp_timestamp { /** Seconds encoded on 48 bits - high 16 bits. */ uint16_t seconds_high; /** Seconds encoded on 48 bits - low 32 bits. */ uint32_t seconds_low; /** Nanoseconds. */ uint32_t nanoseconds; } __packed; /** * @brief PTP Clock Identity. * @note 5.3.4 - identifies unique entities within a PTP network. */ typedef struct { /** ID bytes. */ uint8_t id[8]; } ptp_clk_id; /** * @brief PTP Port Identity. * @note 5.3.5 - identifies a PTP Port or a Link port. */ struct ptp_port_id { /** PTP Clock ID. */ ptp_clk_id clk_id; /** PTP Port number. */ uint16_t port_number; } __packed; /** * @brief Structure represeniting address of a PTP Port. * @note 5.3.6 - represents the protocol address of a PTP port */ struct ptp_port_addr { /** PTP Port's protocol. */ uint16_t protocol; /** Address length. */ uint16_t addr_len; /** Address field. */ uint8_t address[]; } __packed; /** * @brief Structure for PTP Clock quality metrics. * @note 5.3.7 - quality of a clock */ struct ptp_clk_quality { /** PTP Clock's class */ uint8_t class; /** Accuracy of the PTP Clock. */ uint8_t accuracy; /** Value representing stability of the Local PTP Clock. */ uint16_t offset_scaled_log_variance; } __packed; /** * @brief * @note 5.3.8 - TLV (type, length, value) extension fields */ struct ptp_tlv { /** Type of the TLV value. */ uint16_t type; /** Length of the TLV value field. */ uint16_t length; /** TLV's data field. */ uint8_t value[]; } __packed; /** * @brief Generic datatype for storing text in PTP messages. * @note 5.3.9 - holds textual content in PTP messages */ struct ptp_text { /** Length of the text field. * * @note Might be larger than number of symbols due to UTF-8 encoding. */ uint8_t length; /** Text itself. * * @note Encoded as UTF-8, single symbol can be 1-4 bytes long */ uint8_t text[]; } __packed; /** * @brief Type holding difference between two numeric value * @note 5.3.11 - relative difference between two numeric values. * It's a dimensionless fraction and multiplied by 2^62. */ typedef int64_t ptp_relative_diff; struct ptp_port; struct ptp_clock; #ifdef __cplusplus } #endif /** * @} */ #endif /* ZEPHYR_INCLUDE_PTP_PDT_H_ */