| /* |
| * Copyright (c) 2018 Intel Corporation. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** |
| * @file |
| * @brief Public functions for the Precision Time Protocol time specification. |
| * |
| */ |
| |
| #ifndef ZEPHYR_INCLUDE_NET_PTP_TIME_H_ |
| #define ZEPHYR_INCLUDE_NET_PTP_TIME_H_ |
| |
| /** |
| * @brief Precision Time Protocol time specification |
| * @defgroup ptp_time PTP time |
| * @ingroup networking |
| * @{ |
| */ |
| |
| #include <net/net_core.h> |
| #include <toolchain.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * @brief Precision Time Protocol Timestamp format. |
| * |
| * This structure represents a timestamp according |
| * to the Precision Time Protocol standard. |
| * |
| * Seconds are encoded as a 48 bits unsigned integer. |
| * Nanoseconds are encoded as a 32 bits unsigned integer. |
| */ |
| struct net_ptp_time { |
| /** Seconds encoded on 48 bits. */ |
| union { |
| struct { |
| #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| uint32_t low; |
| uint16_t high; |
| uint16_t unused; |
| #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ |
| uint16_t unused; |
| uint16_t high; |
| uint32_t low; |
| #else |
| #error "Unknown byte order" |
| #endif |
| } _sec; |
| uint64_t second; |
| }; |
| |
| /** Nanoseconds. */ |
| uint32_t nanosecond; |
| }; |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| /** |
| * @brief Precision Time Protocol Extended Timestamp format. |
| * |
| * This structure represents an extended timestamp according |
| * to the Precision Time Protocol standard. |
| * |
| * Seconds are encoded as 48 bits unsigned integer. |
| * Fractional nanoseconds are encoded as 48 bits, their unit |
| * is 2*(-16) ns. |
| */ |
| struct net_ptp_extended_time { |
| /** Seconds encoded on 48 bits. */ |
| union { |
| struct { |
| #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| uint32_t low; |
| uint16_t high; |
| uint16_t unused; |
| #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ |
| uint16_t unused; |
| uint16_t high; |
| uint32_t low; |
| #else |
| #error "Unknown byte order" |
| #endif |
| } _sec; |
| uint64_t second; |
| }; |
| |
| /** Fractional nanoseconds on 48 bits. */ |
| union { |
| struct { |
| #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| uint32_t low; |
| uint16_t high; |
| uint16_t unused; |
| #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ |
| uint16_t unused; |
| uint16_t high; |
| uint32_t low; |
| #else |
| #error "Unknown byte order" |
| #endif |
| } _fns; |
| uint64_t fract_nsecond; |
| }; |
| } __packed; |
| |
| /** |
| * @} |
| */ |
| |
| #endif /* ZEPHYR_INCLUDE_NET_PTP_TIME_H_ */ |