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.
dvmhost/src/common/network/packet/Pong.cpp

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;
}

Powered by TurnKey Linux.