aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Net/src/NTPPacket.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Net/src/NTPPacket.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Net/src/NTPPacket.cpp')
-rw-r--r--contrib/libs/poco/Net/src/NTPPacket.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/contrib/libs/poco/Net/src/NTPPacket.cpp b/contrib/libs/poco/Net/src/NTPPacket.cpp
new file mode 100644
index 0000000000..2f7aec830c
--- /dev/null
+++ b/contrib/libs/poco/Net/src/NTPPacket.cpp
@@ -0,0 +1,158 @@
+//
+// NTPPacket.cpp
+//
+// Library: Net
+// Package: NTP
+// Module: NTPPacket
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/NTPPacket.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Timestamp.h"
+#include "Poco/ByteOrder.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+#if !defined(POCO_COMPILER_SUN)
+#pragma pack(push, 1)
+#else
+#pragma pack(1)
+#endif
+struct NTPPacketData
+{
+ Poco::Int8 mode:3;
+ Poco::Int8 vn:3;
+ Poco::Int8 li:2;
+ Poco::Int8 stratum;
+ Poco::Int8 pool;
+ Poco::Int8 prec;
+ Poco::Int32 rootdelay;
+ Poco::Int32 rootdisp;
+ Poco::Int32 refid;
+ Poco::Int64 rts;
+ Poco::Int64 ots;
+ Poco::Int64 vts;
+ Poco::Int64 tts;
+};
+#if !defined(POCO_COMPILER_SUN)
+#pragma pack(pop)
+#else
+#pragma pack()
+#endif
+
+
+NTPPacket::NTPPacket() :
+ // the next 3 fields must be in reverse order from spec
+ _leapIndicator(3),
+ _version(4),
+ _mode(3),
+
+ _stratum(0),
+ _pool(6),
+ _precision(-18),
+ _rootDelay(0),
+ _rootDispersion(0),
+ _referenceId(0),
+ _referenceTimestamp(0),
+ _receiveTimestamp(0),
+ _transmitTimestamp(0)
+{
+ Poco::Timestamp ts;
+ _originateTimestamp = ts.utcTime() - 2874597888;
+}
+
+
+NTPPacket::NTPPacket(Poco::UInt8 *packet)
+{
+ setPacket(packet);
+}
+
+
+NTPPacket::~NTPPacket()
+{
+}
+
+
+void NTPPacket::packet(Poco::UInt8 *packet) const
+{
+ NTPPacketData *p = (NTPPacketData*)packet;
+
+ p->li = _leapIndicator;
+ p->vn = _version;
+ p->mode = _mode;
+ p->stratum = _stratum;
+ p->pool = _pool;
+ p->prec = _precision;
+ p->rootdelay = Poco::ByteOrder::toNetwork(_rootDelay);
+ p->rootdisp = Poco::ByteOrder::toNetwork(_rootDispersion);
+ p->refid = Poco::ByteOrder::toNetwork(_referenceId);
+ p->rts = Poco::ByteOrder::toNetwork(_referenceTimestamp);
+ p->ots = Poco::ByteOrder::toNetwork(_originateTimestamp);
+ p->vts = Poco::ByteOrder::toNetwork(_receiveTimestamp);
+ p->tts = Poco::ByteOrder::toNetwork(_transmitTimestamp);
+}
+
+
+void NTPPacket::setPacket(Poco::UInt8 *packet)
+{
+ NTPPacketData *p = (NTPPacketData*)packet;
+
+ _leapIndicator = p->li;
+ _version = p->vn;
+ _mode = p->mode;
+ _stratum = p->stratum;
+ _pool = p->pool;
+ _precision = p->prec;
+ _rootDelay = Poco::ByteOrder::fromNetwork(p->rootdelay);
+ _rootDispersion = Poco::ByteOrder::fromNetwork(p->rootdisp);
+ _referenceId = Poco::ByteOrder::fromNetwork(p->refid);
+ _referenceTimestamp = Poco::ByteOrder::fromNetwork(p->rts);
+ _originateTimestamp = Poco::ByteOrder::fromNetwork(p->ots);
+ _receiveTimestamp = Poco::ByteOrder::fromNetwork(p->vts);
+ _transmitTimestamp = Poco::ByteOrder::fromNetwork(p->tts);
+}
+
+
+Poco::Timestamp NTPPacket::referenceTime() const
+{
+ return convertTime(_referenceTimestamp);
+}
+
+
+Poco::Timestamp NTPPacket::originateTime() const
+{
+ return convertTime(_originateTimestamp);
+}
+
+
+Poco::Timestamp NTPPacket::receiveTime() const
+{
+ return convertTime(_receiveTimestamp);
+}
+
+
+Poco::Timestamp NTPPacket::transmitTime() const
+{
+ return convertTime(_transmitTimestamp);
+}
+
+
+Poco::Timestamp NTPPacket::convertTime(Poco::Int64 tm) const
+{
+ const unsigned long seventyYears = 2208988800UL;
+ Poco::UInt32 secsSince1900 = UInt32(Poco::ByteOrder::toLittleEndian(tm) >> 32);
+ unsigned long epoch = secsSince1900 - seventyYears;
+ return Poco::Timestamp::fromEpochTime(epoch);
+}
+
+
+} } // namespace Poco::Net