blob: 740416c2ba4627aa0fd996d4ed288719b40daef8 [file] [log] [blame]
/*
* 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_ */