mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
Finalizations, cleanup, and security improvements.
This commit is contained in:
@@ -11,6 +11,24 @@ static uint8_t SNTPQueryData[48] = {
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
};
|
||||
|
||||
// NTP timestamp constant
|
||||
#define NTP_UNIX_OFFSET 0x83AA7E80
|
||||
|
||||
// SNTP packet offsets
|
||||
#define NTP_OFF_INFO 0
|
||||
#define NTP_OFF_ROOTDELAY 1
|
||||
#define NTP_OFF_ROOTDISP 2
|
||||
#define NTP_OFF_REFERENCEID 3
|
||||
#define NTP_OFF_REFTS_INT 4
|
||||
#define NTP_OFF_REFTS_FRAC 5
|
||||
#define NTP_OFF_ORGTS_INT 6
|
||||
#define NTP_OFF_ORGTS_FRAC 7
|
||||
#define NTP_OFF_RECVTS_INT 8
|
||||
#define NTP_OFF_RECVTS_FRAC 9
|
||||
#define NTP_OFF_XMITTS_INT 10
|
||||
#define NTP_OFF_XMITTS_FRAC 11
|
||||
|
||||
|
||||
SNTPClient::SNTPClient(boost::asio::io_service& service) :
|
||||
mIOService(service), mSocket(service), mTimer(service), mResolver(service),
|
||||
mOffset(0), mLastOffsetUpdate((time_t) -1), mReceiveBuffer(256)
|
||||
@@ -45,7 +63,10 @@ void SNTPClient::resolveComplete(const boost::system::error_code& error, boost::
|
||||
}
|
||||
query.mReceivedReply = false;
|
||||
query.mLocalTimeSent = now;
|
||||
mSocket.async_send_to(boost::asio::buffer(SNTPQueryData, 256), *sel,
|
||||
query.mQueryMagic = rand();
|
||||
reinterpret_cast<uint32*>(SNTPQueryData)[NTP_OFF_XMITTS_INT] = time(NULL) + NTP_UNIX_OFFSET;
|
||||
reinterpret_cast<uint32*>(SNTPQueryData)[NTP_OFF_XMITTS_FRAC] = query.mQueryMagic;
|
||||
mSocket.async_send_to(boost::asio::buffer(SNTPQueryData, 48), *sel,
|
||||
boost::bind(&SNTPClient::sendComplete, this,
|
||||
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
|
||||
}
|
||||
@@ -68,11 +89,12 @@ void SNTPClient::receivePacket(const boost::system::error_code& error, std::size
|
||||
query->second.mReceivedReply = true;
|
||||
if (time(NULL) > (query->second.mLocalTimeSent + 1))
|
||||
Log(lsWARNING) << "SNTP: Late response";
|
||||
else if (bytes_xferd < 48)
|
||||
Log(lsWARNING) << "SNTP: Short reply (" << bytes_xferd << ") " << mReceiveBuffer.size();
|
||||
else if (reinterpret_cast<uint32*>(&mReceiveBuffer[0])[NTP_OFF_ORGTS_FRAC] != query->second.mQueryMagic)
|
||||
Log(lsWARNING) << "SNTP: Reply had wrong magic number";
|
||||
else
|
||||
if (bytes_xferd < 48)
|
||||
Log(lsWARNING) << "SNTP: Short reply (" << bytes_xferd << ") " << mReceiveBuffer.size();
|
||||
else
|
||||
processReply();
|
||||
processReply();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,8 +114,8 @@ void SNTPClient::processReply()
|
||||
assert(mReceiveBuffer.size() >= 48);
|
||||
uint32 *recvBuffer = reinterpret_cast<uint32*>(&mReceiveBuffer.front());
|
||||
|
||||
unsigned info = ntohl(recvBuffer[0]);
|
||||
int64_t timev = ntohl(recvBuffer[8]);
|
||||
unsigned info = ntohl(recvBuffer[NTP_OFF_INFO]);
|
||||
int64_t timev = ntohl(recvBuffer[NTP_OFF_RECVTS_INT]);
|
||||
unsigned stratum = (info >> 16) & 0xff;
|
||||
|
||||
if ((info >> 30) == 3)
|
||||
@@ -109,7 +131,7 @@ void SNTPClient::processReply()
|
||||
|
||||
time_t now = time(NULL);
|
||||
timev -= now;
|
||||
timev -= 0x83AA7E80ULL;
|
||||
timev -= NTP_UNIX_OFFSET;
|
||||
Log(lsTRACE) << "SNTP: Offset is " << timev;
|
||||
|
||||
if ((mLastOffsetUpdate == (time_t) -1) || (mLastOffsetUpdate < (now - 180)))
|
||||
@@ -181,7 +203,7 @@ bool SNTPClient::doQuery()
|
||||
time_t now = time(NULL);
|
||||
if ((best->second == now) || (best->second == (now - 1)))
|
||||
{
|
||||
Log(lsINFO) << "SNTP: All servers recently queried";
|
||||
Log(lsTRACE) << "SNTP: All servers recently queried";
|
||||
return false;
|
||||
}
|
||||
best->second = now;
|
||||
@@ -190,6 +212,6 @@ bool SNTPClient::doQuery()
|
||||
mResolver.async_resolve(query,
|
||||
boost::bind(&SNTPClient::resolveComplete, this,
|
||||
boost::asio::placeholders::error, boost::asio::placeholders::iterator));
|
||||
Log(lsINFO) << "SNTP: Resolve pending for " << best->first;
|
||||
Log(lsTRACE) << "SNTP: Resolve pending for " << best->first;
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user