genode/repos/os/include/net/sntp.h
Martin Stein cb6377355e sntp_client: report received transmit timestamp
For now in libports because it relies on contrib sources from musl doing
the time data conversion.

Ref #3448
Ref #3450
2019-08-21 12:37:02 +02:00

112 lines
2.7 KiB
C++

/*
* \brief Simple Network Time Protocol (SNTP) Version 4 (RFC 4330)
* \author Martin Stein
* \date 2019-07-11
*/
/*
* Copyright (C) 2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _NET__SNTP_H_
#define _NET__SNTP_H_
/* Genode includes */
#include <util/register.h>
namespace Net
{
class Sntp_timestamp;
class Sntp_packet;
}
class Net::Sntp_timestamp
{
private:
using uint32_t = Genode::uint32_t;
using uint64_t = Genode::uint64_t;
enum { UNIX_TS_OFFSET_SEC = 2208988800 };
uint32_t const _seconds;
uint32_t const _seconds_fraction;
public:
Sntp_timestamp(uint64_t const plain_value)
:
_seconds { (uint32_t)(plain_value >> 32) },
_seconds_fraction { (uint32_t)(plain_value) }
{ }
uint64_t to_unix_timestamp() const
{
return _seconds - UNIX_TS_OFFSET_SEC;
}
static Sntp_timestamp from_unix_timestamp(uint64_t const unix_ts)
{
return unix_ts + UNIX_TS_OFFSET_SEC;
}
/***************
** Accessors **
***************/
uint32_t seconds() const { return _seconds; }
uint32_t seconds_fraction() const { return _seconds_fraction; }
};
class Net::Sntp_packet
{
private:
Genode::uint8_t _byte_0;
Genode::uint8_t _stratum;
Genode::uint8_t _poll;
Genode::uint8_t _precision;
Genode::uint32_t _root_delay;
Genode::uint32_t _root_dispersion;
Genode::uint32_t _reference_identifier;
Genode::uint64_t _reference_timestamp;
Genode::uint64_t _originate_timestamp;
Genode::uint64_t _receive_timestamp;
Genode::uint64_t _transmit_timestamp;
struct Byte_0 : Genode::Register<8> {
struct Mode : Bitfield<0, 3> { };
struct Version_number : Bitfield<3, 3> { };
};
public:
enum { UDP_PORT = 123 };
enum { VERSION_NUMBER = 4 };
enum { MODE_CLIENT = 3 };
enum { MODE_SERVER = 4 };
/***************
** Accessors **
***************/
void version_number(Genode::uint8_t v) { Byte_0::Version_number::set(_byte_0, v); }
void mode (Genode::uint8_t v) { Byte_0::Mode ::set(_byte_0, v); }
Byte_0::access_t version_number() const { return Byte_0::Version_number::get(_byte_0); }
Byte_0::access_t mode() const { return Byte_0::Mode::get(_byte_0); }
Genode::uint64_t transmit_timestamp() const { return host_to_big_endian(_transmit_timestamp); }
Genode::uint64_t receive_timestamp() const { return host_to_big_endian(_receive_timestamp); }
Genode::uint64_t originate_timestamp() const { return host_to_big_endian(_originate_timestamp); }
} __attribute__((packed));
#endif /* _NET__SNTP_H_ */