zephyr/include/net/ptp_time.h
Tomasz Gorochowik 792dfd4a04 net: gptp: Convert SyncReceiptTime to ExtendedTimestamp
SyncReceiptTime should use an ExtendedTimestamp (with fractional
nanoseconds precision). Add a struct with the definition of the needed
type and convert that variable.

The struct representing the ExtendedTimestamp is named
net_ptp_extended_time to keep consistency with the existing net_ptp_time
which is used for regular PTP timestamps.

See 802.1AS-2011 chapters 10.2.3.4 and 6.3.3.5 for more reference.

Signed-off-by: Tomasz Gorochowik <tgorochowik@antmicro.com>
2018-10-01 14:48:53 +03:00

118 lines
2.1 KiB
C

/*
* 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>
#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__
u32_t low;
u16_t high;
u16_t unused;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
u16_t unused;
u16_t high;
u32_t low;
#else
#error "Unknown byte order"
#endif
} _sec;
u64_t second;
};
/** Nanoseconds. */
u32_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__
u32_t low;
u16_t high;
u16_t unused;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
u16_t unused;
u16_t high;
u32_t low;
#else
#error "Unknown byte order"
#endif
} _sec;
u64_t second;
};
/** Fractional nanoseconds on 48 bits. */
union {
struct {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
u32_t low;
u16_t high;
u16_t unused;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
u16_t unused;
u16_t high;
u32_t low;
#else
#error "Unknown byte order"
#endif
} _fns;
u64_t fract_nsecond;
};
} __packed;
/**
* @}
*/
#endif /* ZEPHYR_INCLUDE_NET_PTP_TIME_H_ */