You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.5 KiB
68 lines
2.5 KiB
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Digital Voice Modem - Common Library
|
|
* GPLv2 Open Source. Use is subject to license terms.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright (C) 2017-2026 Bryan Biedenkapp, N2PLL
|
|
*
|
|
*/
|
|
#include "Defines.h"
|
|
#include "common/Log.h"
|
|
#include "network/Network.h"
|
|
|
|
using namespace network;
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Constants
|
|
// ---------------------------------------------------------------------------
|
|
|
|
#define MAX_SERVER_DIFF 360ULL // maximum difference in time between a server timestamp and local timestamp in milliseconds
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Public Class Members
|
|
// ---------------------------------------------------------------------------
|
|
|
|
/* Handles NET_FUNC::PONG packets. */
|
|
|
|
bool Network::PacketHandler::pong(Network* network, uint32_t peerId, uint32_t streamId, uint64_t now,
|
|
const frame::RTPFNEHeader& fneHeader, const frame::RTPHeader& rtpHeader, const uint8_t* buffer, int length)
|
|
{
|
|
(void)peerId;
|
|
(void)streamId;
|
|
(void)fneHeader;
|
|
(void)rtpHeader;
|
|
|
|
network->m_timeoutTimer.start();
|
|
if (length >= 14) {
|
|
if (network->m_packetDump)
|
|
Utils::dump(1U, "Network::clock(), Network Rx, PONG", buffer, length);
|
|
|
|
ulong64_t serverNow = 0U;
|
|
|
|
// combine bytes into ulong64_t (8 byte) value
|
|
serverNow = buffer[6U];
|
|
serverNow = (serverNow << 8) + buffer[7U];
|
|
serverNow = (serverNow << 8) + buffer[8U];
|
|
serverNow = (serverNow << 8) + buffer[9U];
|
|
serverNow = (serverNow << 8) + buffer[10U];
|
|
serverNow = (serverNow << 8) + buffer[11U];
|
|
serverNow = (serverNow << 8) + buffer[12U];
|
|
serverNow = (serverNow << 8) + buffer[13U];
|
|
|
|
// check the ping RTT and report any over the maximum defined time
|
|
uint64_t dt = (uint64_t)fabs((double)now - (double)serverNow);
|
|
if (dt > MAX_SERVER_DIFF)
|
|
LogWarning(LOG_NET, "PEER %u pong, time delay greater than %llums, now = %llu, server = %llu, dt = %llu", network->m_peerId, MAX_SERVER_DIFF, now, serverNow, dt);
|
|
|
|
++network->m_pingsReceived;
|
|
|
|
// if we've been connected for at least 10 PING/PONG cycles and we're flagged duplicate connection, clear the flag
|
|
if (network->m_pingsReceived > 10U && network->m_flaggedDuplicateConn) {
|
|
network->m_flaggedDuplicateConn = false;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|