Files
rtphone/src/libs/ice/ICEPacketTimer.cpp

91 lines
2.0 KiB
C++

/* Copyright(C) 2007-2014 VoIP objects (voipobjects.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "ICEPlatform.h"
#include "ICEPacketTimer.h"
#include "ICETime.h"
using namespace ice;
PacketScheduler::PacketScheduler()
{
mTimestamp = 0;
mAttemptCounter = 0;
mInitialRTO = 100;
mLastRTO = 100;
}
void PacketScheduler::setInitialRTO(int value)
{
mInitialRTO = value;
}
int PacketScheduler::initialRTO()
{
return mInitialRTO;
}
void PacketScheduler::start()
{
mLastRTO = mInitialRTO;
mAttemptCounter = 0;
mTimestamp = 0;//ICETimeHelper::timestamp();
}
void PacketScheduler::stop()
{
;
}
bool PacketScheduler::isTimeToRetransmit()
{
if (!mTimestamp)
{
mTimestamp = ICETimeHelper::timestamp();
return true;
}
unsigned currentTime = ICETimeHelper::timestamp();
unsigned delta = ICETimeHelper::findDelta(mTimestamp, currentTime);
return delta >= mLastRTO;
}
/// Instructs timer that attempt made
void PacketScheduler::attemptMade()
{
// Increase attempt counter
mAttemptCounter++;
// Save new timestamp
mTimestamp = ICETimeHelper::timestamp();
// Increase mLastRTO
#ifndef ICE_SIMPLE_SCHEDULE
mLastRTO *= 2;
#endif
}
/// Checks if attempt limit reached
bool PacketScheduler::isAttemptLimitReached()
{
return mAttemptCounter >= ICE_TRANSACTION_RTO_LIMIT;
}
/// Checks if timeout happens
bool PacketScheduler::isTimeout()
{
// Are attempts to send finished?
if (!isAttemptLimitReached())
return false;
// Get current time
unsigned int currentTime = ICETimeHelper::timestamp();
// Get difference between current time and last send attempt
unsigned int delta = ICETimeHelper::findDelta(mTimestamp, currentTime);
return delta > mLastRTO * 16;
}